为什么我的程序在等待弹出窗口关闭?
Why is my program waiting for the popup to close?
我正在尝试在我的 C# 项目中使用 user32.dll 的方法来实现另一个程序的自动化。我创建了一个小测试程序来自动输入文本并单击一个按钮。单击该按钮后,会出现一个弹出窗口,可以使用 'yes' 按钮将其关闭。
但是,一旦弹出窗口打开,我的程序就会等待它关闭,直到它继续 运行 它的代码。 (我必须手动点击按钮)
如何让代码 运行 访问弹出窗口 window?
Console.WriteLine("Please press enter to continue.");
Console.ReadLine();
identifyProcess();
RemoteMethods.updateWindows(_MainWnd);
IntPtr saveButton = RemoteMethods.GetChildWindow(RemoteMethods.GetIndexByTitle(_MainWnd, "Save")[0]);
IntPtr titleTF = RemoteMethods.GetChildWindow(3);
IntPtr nameTF = RemoteMethods.GetChildWindow(5);
IntPtr streetTF = RemoteMethods.GetChildWindow(1);
//Replacing Text
RemoteMethods.SendMessage(titleTF, RemoteMethods.WM_SETTEXT, IntPtr.Zero, "Mr.");
RemoteMethods.SendMessage(nameTF, RemoteMethods.WM_SETTEXT, IntPtr.Zero, "Berg");
RemoteMethods.SendMessage(streetTF, RemoteMethods.WM_SETTEXT, IntPtr.Zero, "Fountainally 3.");
RemoteMethods.ClickButton(saveButton);
//Popup appears here
//But the program only continues after i click 'Yes' manually.
Console.WriteLine("Test");
IntPtr nW = RemoteMethods.GetLastActivePopup(_MainWnd);
RemoteMethods.updateWindows(nW);
IntPtr yesButton = RemoteMethods.GetChildWindow(RemoteMethods.GetIndexByTitle(nW, "Yes")[0]);
RemoteMethods.ClickButton(yesButton);
这是 RemoteMethods class:
https://drive.google.com/file/d/19xtvq6ep8ICKY4WZqY0BBv8schnhzfqs/view?usp=sharing
SendMessage()
将等待消息被处理,即保存按钮的方法处理程序已 运行 结束。如果该处理程序打开另一个 window 并等待用户输入(如您的情况),则不会出现这种情况。
改用SendNotifyMessage()
or Postmessage()
。它们很相似,但是 SendNotifyMessage()
会比 PostMessage()
给予消息更高的优先级。这两种方法都以异步方式工作,即它们将立即return。
这反过来意味着,您可能需要重试查询下一个 window,因为在方法 returned.
时它可能不会直接显示
我正在尝试在我的 C# 项目中使用 user32.dll 的方法来实现另一个程序的自动化。我创建了一个小测试程序来自动输入文本并单击一个按钮。单击该按钮后,会出现一个弹出窗口,可以使用 'yes' 按钮将其关闭。
但是,一旦弹出窗口打开,我的程序就会等待它关闭,直到它继续 运行 它的代码。 (我必须手动点击按钮)
如何让代码 运行 访问弹出窗口 window?
Console.WriteLine("Please press enter to continue.");
Console.ReadLine();
identifyProcess();
RemoteMethods.updateWindows(_MainWnd);
IntPtr saveButton = RemoteMethods.GetChildWindow(RemoteMethods.GetIndexByTitle(_MainWnd, "Save")[0]);
IntPtr titleTF = RemoteMethods.GetChildWindow(3);
IntPtr nameTF = RemoteMethods.GetChildWindow(5);
IntPtr streetTF = RemoteMethods.GetChildWindow(1);
//Replacing Text
RemoteMethods.SendMessage(titleTF, RemoteMethods.WM_SETTEXT, IntPtr.Zero, "Mr.");
RemoteMethods.SendMessage(nameTF, RemoteMethods.WM_SETTEXT, IntPtr.Zero, "Berg");
RemoteMethods.SendMessage(streetTF, RemoteMethods.WM_SETTEXT, IntPtr.Zero, "Fountainally 3.");
RemoteMethods.ClickButton(saveButton);
//Popup appears here
//But the program only continues after i click 'Yes' manually.
Console.WriteLine("Test");
IntPtr nW = RemoteMethods.GetLastActivePopup(_MainWnd);
RemoteMethods.updateWindows(nW);
IntPtr yesButton = RemoteMethods.GetChildWindow(RemoteMethods.GetIndexByTitle(nW, "Yes")[0]);
RemoteMethods.ClickButton(yesButton);
这是 RemoteMethods class: https://drive.google.com/file/d/19xtvq6ep8ICKY4WZqY0BBv8schnhzfqs/view?usp=sharing
SendMessage()
将等待消息被处理,即保存按钮的方法处理程序已 运行 结束。如果该处理程序打开另一个 window 并等待用户输入(如您的情况),则不会出现这种情况。
改用SendNotifyMessage()
or Postmessage()
。它们很相似,但是 SendNotifyMessage()
会比 PostMessage()
给予消息更高的优先级。这两种方法都以异步方式工作,即它们将立即return。
这反过来意味着,您可能需要重试查询下一个 window,因为在方法 returned.
时它可能不会直接显示