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

Vir*_*rus 5 c# winapi messagebox

我试图使用winapi单击C#窗体的消息框上的"确定"按钮.以下是我正在处理的代码.

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);
Run Code Online (Sandbox Code Playgroud)

虽然我得到了一个价值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);
Run Code Online (Sandbox Code Playgroud)

Dar*_*con 11

BN_CLICKED不是消息.您需要发送包含BN_CLICKED通知和wParam按钮句柄中的按钮ID 的WM_COMMAND消息lParam.

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

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);
Run Code Online (Sandbox Code Playgroud)

  • @Virus:因为`WM_CLOSE`是一条消息,就像`WM_COMMAND`.正如我所说,"BN_CLICKED"不是一条消息.请看这个例子. (2认同)

Vir*_*rus 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);
Run Code Online (Sandbox Code Playgroud)