【转】[C#.NET][VB.NET] 用 Win32 API 控制 外部應用程式選單

来源:互联网 发布:机械工业信息及网络 编辑:程序博客网 时间:2024/05/17 23:11

1.這並不是用SendKey所組成的,所以不管應用程式是否在最上層,都能控制的到。

2.匯入 System.Runtime.InteropServicesSystem.Threading 命名空間

3.選單控制主要由下列三隻API組成


        [DllImport("user32.dll", EntryPoint = "GetMenu")]

        public static extern int GetMenu(

            int hwnd

        );

        [DllImport("user32.dll", EntryPoint = "GetSubMenu")]

        public static extern int GetSubMenu(

            int hMenu,

            int nPos

        );

        [DllImport("user32.dll", EntryPoint="GetMenuItemID")]

        public static extern int GetMenuItemID(

            int hMenu,

            int nPos

        );


 

4.GetMenu所指的就是"主選單"工具列,如下圖所示。

快照-20097663059

而GetSubMenu指的就是"主選單"內的"子選單",由下圖可看到項目有五個"子選單",分別為:檔案(F)、編輯(E)、格式(O)、檢視(V)、說明(H)。

快照-2009766332

GetMenuItemID則是"子選單"中的"項目"

快照-20097663522

5.選單API的啟始值是0,GetSubMenu(gm, 0)表示第1個選單

快照-2009766332

GetSubMenu(gm, 1)表示第2個選單

快照-20097664922


 


6.GetMenuItemID用法同如上所示 ,int id = GetMenuItemID(gm, 3),表示第4個項目。

快照-20097663522

7.完整範例

C#


using System;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Diagnostics;

using System.Threading;

 

namespace CS_ControlMenu

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private const int WM_COMMAND = 0x111;

        [DllImport("user32.dll", EntryPoint = "FindWindow")]

        public static extern int FindWindow(

            string lpClassName,

            string lpWindowName

        );

        [DllImport("user32.dll", EntryPoint = "GetMenu")]

        public static extern int GetMenu(

            int hwnd

        );

        [DllImport("user32.dll", EntryPoint = "GetSubMenu")]

        public static extern int GetSubMenu(

            int hMenu,

            int nPos

        );

        [DllImport("user32.dll", EntryPoint="GetMenuItemID")]

        public static extern int GetMenuItemID(

            int hMenu,

            int nPos

        );

        [DllImport("user32.dll", EntryPoint = "PostMessage")]

        public static extern int PostMessage(

            int hwnd,

            int wMsg,

            int wParam,

            int lParam

        );

 

        private void button1_Click(object sender, EventArgs e)

        {

            //呼叫外部程式

            Process.Start(@"C:\windows\system32\notepad.exe");

            //等執行程式一下下

            Thread.Sleep(100);

            //取得外部程式的Handle

            int NotepadHwnd = FindWindow("notepad", null);

            //取得外部程式的選單Handle

            int gm = GetMenu(NotepadHwnd);

            //取得第一個子選單Handle

            gm = GetSubMenu(gm, 0); //選單的句柄 改變後面的0,就可以得到不同選單的句柄

            //取得子選單的ID

            int id = GetMenuItemID(gm, 3); //子選單"另存新檔"的ID

            //執行子選單

            PostMessage (NotepadHwnd, WM_COMMAND, id, 0);

 

        }

    }

}

转载地址:http://www.dotblogs.com.tw/yc421206/archive/2009/07/06/9142.aspx

0 0