以编程方式单击“消息框”按钮

正如标题所示,我正在尝试以编程方式模拟MessageBox中的按钮单击。 我之前尝试通过其标题查找其句柄,并在SendMessage()应用WM_CLOSESC_CLOSE来关闭MessageBox。 但是,由于存在“是/否”按钮,这不起作用(X按钮显示为灰色)。

现在我试图点击No按钮,如下所示 – :

 List result = new List(); GCHandle listHandle = GCHandle.Alloc(result); try { IntPtr Window_hWnd = CloseMessageBox.FindWindowByCaption("#32770", "LastQuestion"); //Could use null as the first argument too. "#32770" represents classname Dialog. CloseMessageBox.EnumChildWindows(Window_hWnd, (hWnd, lParam) => { StringBuilder sb = new StringBuilder(); foreach (var control in GCHandle.FromIntPtr(lParam).Target as List) { CloseMessageBox.GetWindowText(control, sb, 250); if (sb.Equals("&No")) { CloseMessageBox.PostMessage(hWnd, CloseMessageBox.MouseDown, 0, 0); CloseMessageBox.PostMessage(hWnd, CloseMessageBox.MouseUp, 0, 0); } } return false; }, GCHandle.ToIntPtr(listHandle)); } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { if (listHandle.IsAllocated) listHandle.Free(); } 

从IRC的某个人的建议到目前为止,我发现之前有一些编辑,我得到了按钮句柄(只有“&Yes”按钮)但不是全部。 然后他提出了这种方法,但control列表没有填充,因此它永远不会进入foreach 。 我该怎么做才能解决这个问题?

干得好。

 // A delegate which is used by EnumChildWindows to execute a callback method. public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter); // This method accepts a string which represents the title name of the window you're looking for the controls on. public static void ClickButtonLabeledNo(string windowTitle) { try { // Find the main window's handle by the title. var windowHWnd = FindWindowByCaption(IntPtr.Zero, windowTitle); // Loop though the child windows, and execute the EnumChildWindowsCallback method EnumChildWindows(windowHWnd, EnumChildWindowsCallback, IntPtr.Zero); } catch (Exception e) { MessageBox.Show(e.ToString()); } } private static bool EnumChildWindowsCallback(IntPtr handle, IntPtr pointer) { const uint WM_LBUTTONDOWN = 0x0201; const uint WM_LBUTTONUP = 0x0202; var sb = new StringBuilder(256); // Get the control's text. GetWindowCaption(handle, sb, 256); var text = sb.ToString(); // If the text on the control == &No send a left mouse click to the handle. if (text == @"&No") { PostMessage(handle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); PostMessage(handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero); } return true; } [DllImport("user32")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i); [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] private static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); [DllImport("user32.dll", EntryPoint = "GetWindowText", CharSet = CharSet.Auto)] private static extern IntPtr GetWindowCaption(IntPtr hwnd, StringBuilder lpString, int maxCount); [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll", SetLastError = true)] private static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);