在c#中使用WINAPI单击消息框的“确定”按钮

时间:2013-02-19 16:12:48

标签: c# winapi messagebox

我正在尝试使用winapi点击C#windows窗体的消息框上的“确定”按钮。以下是我正在处理的代码。

private const int WM_CLOSE = 16;
private const int BN_CLICKED = 245;

[DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam);

[DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className,  string  windowTitle);

//this works
hwnd = FindWindow(null, "Message");
if(hwnd!=0)
      SendMessage(hwnd, WM_CLOSE, 0, IntPtr.Zero);

//this doesn't work.
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "ok");
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);

虽然我在hwndChild中获得了值,但却无法识别BN_CLICKED。 我不确定我错过了什么。有什么帮助吗?

我正在尝试关闭另一个应用程序的消息框按钮,这就是我正在做的事情。但是,我仍然缺少一些东西。

IntPtr hwndChild = IntPtr.Zero;
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero,' '"Button", "OK");
SendMessage((int)hwndChild, WM_COMMAND, (BN_CLICKED '<<16) | IDOK, hwndChild);

2 个答案:

答案 0 :(得分:11)

BN_CLICKED不是消息。您需要发送一条WM_COMMAND消息,其中包含wParam通知和lParam中的按钮ID以及private const uint WM_COMMAND = 0x0111; private const int BN_CLICKED = 245; private const int IDOK = 1; [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); SendMessage(hwndChild, WM_COMMAND, (BN_CLICKED << 16) | IDOK, hwndChild); 中的按钮处理。

  

按钮的父窗口收到此通知代码   通过WM_COMMAND消息。

{{1}}

答案 1 :(得分:6)

Finallu,这适合我。 首先点击可能会激活窗口,然后第二次点击按钮。

SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);