事件函数/设置焦点仅适用于包含MessageBox的情况
本文关键字:包含 MessageBox 情况 适用于 函数 设置 焦点 事件 | 更新日期: 2023-09-27 18:21:35
本质上,这个小型Windows Form C#(.NET 3.5)应用程序在侦听事件时出现问题。
我在表单上设置了两个按钮来直接调用我的两个主要函数(它们是向另一个进程窗口发送键击,并切换我的布尔值以显示它是否已经发送)。
有问题的部分是我正在监视的实际事件,以自动激发与两个按钮相同的功能。只有当我不包括MessageBox.Show("Blah Blah");
时,事件处理程序才会不成功
示例:
public tester()
InitializeComponent();
wsiRemote.clsWsiEventsClass Events = new wsiRemote.clsWsiEventsClass();
Events.AuthorRecordStarted += new __clsWsiEvents_AuthorRecordStartedEventHandler(Events_AuthorRecordStarted);
private static bool _pedcheck = false;
public static void SendkeyT()
{
foreach (Process w in System.Diagnostics.Process.GetProcessesByName("WinScribe Internet Author"))
{
IntPtr hwnd = w.MainWindowHandle;
SetForegroundWindow(hwnd);
}
if (_pedcheck == false)
{
foreach (Process p in System.Diagnostics.Process.GetProcessesByName("Pedable"))
{
IntPtr hWnd = p.MainWindowHandle;
SetForegroundWindow(hWnd);
InputSimulator.SimulateKeyDown(VirtualKeyCode.CONTROL);
InputSimulator.SimulateKeyPress(VirtualKeyCode.VK_D);
InputSimulator.SimulateKeyUp(VirtualKeyCode.CONTROL);
_pedcheck = true;
}
else
{
MessageBox.Show("Boolean Failure");
}
}
public void button1_Click(object sender, EventArgs e)
{
SendkeyT();
}
public void Events_AuthorRecordStarted(string msg)
{
// MessageBox.Show("Recording Started");
SendkeyT();
}
如果我取消对MessageBox的注释,它就会触发并向用户显示该框。一旦用户单击"OK",该功能就会正常启动。我注意到,如果我不包括消息框,那么正在发送按键并处于活动状态的窗口就会开始在任务栏中闪烁,所以我认为这与前台设置有关。
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
如果有人有任何建议,我将不胜感激
谢谢!
有些时候,"应用程序"的主窗口句柄不是"逻辑"主窗口的句柄(您想将焦点设置为),大多数时候,主窗口甚至是隐藏的,所以设置焦点没有任何区别。
尝试重新设置进程的窗口,然后找到需要设置的窗口。
您可以使用Process Explorer来调查您的应用程序。(如果它是一个特定的应用程序,你想采取行动。)
用法:如何枚举进程中的所有窗口?以帮助获取儿童窗口。
MessageBox.Show(this, "my message");
将"this"传递给MessageBox.Show方法解决了我的问题。