none
如何使用C#调用外部程序(VC++编写的)窗口中的一个按钮控件,并实现点击该按钮的操作? RRS feed

  • 问题

  • 我实现了一个程序,但只能实现找到这个C#程序自己的窗口中某个按钮并进行点击的操作,请问如何实现对外部程序的类似操作?谢谢。

    //////////////////////

    我的代码如下:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr PostMessage(IntPtr   hwnd,   int   wMsg,   IntPtr   wParam,   IntPtr   lParam);

            private void callAppBTN_Click(object sender, EventArgs e)
            {
                IntPtr hwnd_win;
                IntPtr hwnd_button;

                hwnd_win = FindWindow(null, "Call Extern App");
                hwnd_button = FindWindowEx(hwnd_win, new IntPtr(0), null, "Test");
                const int BM_CLICK = 0x00F5; //0x0201;
                Message button_msg = Message.Create(hwnd_button, BM_CLICK, new IntPtr(0), new IntPtr(0));
                PostMessage(button_msg.HWnd, button_msg.Msg, button_msg.WParam, button_msg.LParam);

            }

            private void tstBTN_Click(object sender, EventArgs e)
            {
                MessageBox.Show("Hello Windows!");
            }

    2010年3月23日 9:50

答案

  • 用Spy++ 看看你要调用的那个程序窗体名字叫什么,然后            hwnd_win = FindWindow(null, "调用程序的窗体名字");
                hwnd_button = FindWindowEx(hwnd_win, new IntPtr(0), null, "按钮文字");

    • 已建议为答案 mazhou 2010年3月23日 10:09
    • 已标记为答案 mldark 2010年3月24日 10:21
    • 已标记为答案 mldark 2010年3月24日 10:21
    2010年3月23日 9:58
  • 您需要做的这件事情像是一种 Test Automation。

    上面提到的一种方法是 In-process 的方法,直接找到窗口,然后找到按钮的句柄,然后给这个按钮发 BM_CLICK 消息就好了。

    另一种方法就是利用 Automation 模拟鼠标和键盘操作,然程序帮助您单击那个按钮,如 MSAA。基于 MSAA 的技术框架例如 MAUI、RPF、Mita 等。其实 Visual Studio 2010 包含的 Coded UI Test 就非常适合您使用。


    Mark Zhou
    • 已标记为答案 mldark 2010年3月24日 10:21
    2010年3月23日 10:13

全部回复

  • 用Spy++ 看看你要调用的那个程序窗体名字叫什么,然后            hwnd_win = FindWindow(null, "调用程序的窗体名字");
                hwnd_button = FindWindowEx(hwnd_win, new IntPtr(0), null, "按钮文字");

    • 已建议为答案 mazhou 2010年3月23日 10:09
    • 已标记为答案 mldark 2010年3月24日 10:21
    • 已标记为答案 mldark 2010年3月24日 10:21
    2010年3月23日 9:58
  • 您需要做的这件事情像是一种 Test Automation。

    上面提到的一种方法是 In-process 的方法,直接找到窗口,然后找到按钮的句柄,然后给这个按钮发 BM_CLICK 消息就好了。

    另一种方法就是利用 Automation 模拟鼠标和键盘操作,然程序帮助您单击那个按钮,如 MSAA。基于 MSAA 的技术框架例如 MAUI、RPF、Mita 等。其实 Visual Studio 2010 包含的 Coded UI Test 就非常适合您使用。


    Mark Zhou
    • 已标记为答案 mldark 2010年3月24日 10:21
    2010年3月23日 10:13