第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么最后顯示的結果為-1?

為什么最后顯示的結果為-1?

API
函數式編程 2022-11-19 12:08:36
首先進行聲明:  [DllImport("USER32.dll", EntryPoint = "GetMenuItemCount", CharSet = CharSet.Unicode)]private static extern int apiGetMenuItemCount(IntPtr hMenu);然后我再類里面定義了一個菜單,并給它添加了一系列菜單項:this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.sfToolStripMenuItem,this.sdfToolStripMenuItem,this.sdfToolStripMenuItem1});this.contextMenuStrip1.Name = "contextMenuStrip1";this.contextMenuStrip1.Size = new System.Drawing.Size(95, 70);最后調用API方法獲得它的菜單項的數目并顯示:MessageBox.Show(apiGetMenuItemCount(this.contextMenuStrip1.Handle).ToString());到網上找了,但好像都是用它來操作系統(tǒng)菜單的,可是我想知道怎么操作普通菜單?這段代碼錯在哪里,希望大家能給點指點,謝謝!還有,發(fā)現用EableMenuItem方法可以禁止頁面關閉按鈕,但對最大化和最小化按鈕卻沒用,為什么?各位高手,幫幫忙?。。。≈x謝?。?!謝謝
查看完整描述

2 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

apiFindWindowEx(this.Handle, p, "Edit", "");
上面的Edit 是類名,如果你不知道標題,需要用NULL,而不是""
寫成 apiFindWindowEx(this.Handle, p, "Edit", null);

類名,需要查的,.NET 里面的 TEXTBOX 的類名不是 Edit,而是類似

WindowsForms.10.Edit.xxxxxxx.xx 的樣子,具體的名字,可以用 spy++ 查看
上面的10代表VS的版本,10代表2010,9代表2008,8代表2005

---------------------------------------------------------
你的理解發(fā)生了偏差。

this.contextMenuStrip1.Handle 這個句柄是 這個菜單相對于當前窗體的句柄,是個內部指針。

GetMenuItemCount 里面需要的菜單的句柄是這個窗體的菜單對應于系統(tǒng)級別的指針, 這個句柄,需要用 API 函數 FindWindowEx 來獲取


查看完整回答
反對 回復 2022-11-22
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

一、在VB中聲明API函數有兩種方法:如果我們只在某個窗體中使用API函數,我們可以在窗體代碼的
General部分聲明它:

  聲明的語法是:
  Private Declare Function ...
  Private Declare Sub.....
  這里必須采用Private聲明,因為這個API函數只能被一個窗體內的程序所調用。

  如果我們的程序有多個窗體構成,而且我們需要在多個窗體中使用同一個API函數,就需要在模塊中
聲明了。
  先添加一個模塊(如圖示),
  然后采用如下語法聲明:
  Public Declare Function....
  Public Declare Sub....
  Public聲明的含義是把API函數作為一個公共函數或過程,在一個工程中的任何位置(包括所有的窗
體和模塊)都能直接調用它。聲明完畢我們就能在程序中使用此API函數了。

  二、可采用以下幾種方式使用API函數,以SetWindowPos函數為例:
 ?。?)忽略函數返回值的調用:
    SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3
  注意此時函數的參數是不加括號的。
  (2)Call方法調用:
    Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
  注意這里需要加上括號,但我們不取回函數的返回值。
  (3)取得函數返回值的調用:
    MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
  此時需要加上括號,而且我們必須事先定義一個變量(變量的類型與函數返回值類型相同)來存儲
API函數的返回值。

  三、幾個問題的說明:

 ?。?)聲明中的Lib 和 Alias 是怎么回事
  一般情況下WIN32API函數總是包含在WINDOWS系統(tǒng)自帶的或是其它公司提供的動態(tài)連接庫DLL中,而
Declare語句中的Lib關鍵字就用來指定DLL(動態(tài)連接庫)文件的路徑,這樣VB才能找到這個DLL文件,然
后才能使用其中的API函數。如果我們只是列出DLL文件名而不指出其完整的路徑的話,VB會自動到.EXE文
件所在目錄、當前工作目錄、WINDOWS\SYSTEM目錄、WINDOWS目錄下搜尋這個DLL文件。所以如果所要使用
DLL文件不在上述幾個目錄下的話,我們應該指明其完整路徑。
  Alias用于指定API函數的別名,如果我們調用的API函數要使用字符串(參數中包含String型)的話
,Alias關鍵字是必須的。這是因為在ANSI和Unicode字符集中同一API函數的名稱可能是不一樣的,為了
保證不出現聲明錯誤,我們使用Alias關鍵字指出API函數的別名,一般來說在WIN9X平臺下我們把API函數
名后加一個大寫A作為別名即可。

 ?。?)常見的API參數類型的說明
  API函數的參數中最常見的是長整Long型數據類型,例如API中的句柄、一些特定的常量、函數的返回
值都是此類型 的值;另外幾種常見的參數類型有:整型Integer、Byte型、String型等。

 ?。?)聲明中的ByVal是作什么用的
  這跟VB的參數傳遞方式有關,在默認情況下VB是通過地址傳遞方式傳遞函數的參數、而有些API函數
要求必須采用傳值方式來傳遞函數參數(這兩種參數傳遞方式是不同的,前者傳遞的是一個指針,而后者
要求是參數真實的值)。這樣就會發(fā)生錯誤,解決的辦法是在API函數參數聲明的前面加上ByVal關鍵字,
這樣VB就采用傳值方式傳遞參數了。

 ?。?)怎樣得到完整的API函數聲明
  VB自帶了API文本查看器API TEXT VIEWER,我們可以在其中找到API函數的完整聲明,然后把它粘貼
到程序中即可。

 


查看完整回答
反對 回復 2022-11-22
  • 2 回答
  • 0 關注
  • 181 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號