C# 事件功能/设置焦点仅适用于包含MessageBox的情况

C# 事件功能/设置焦点仅适用于包含MessageBox的情况,c#,event-handling,messagebox,setfocus,keystroke,C#,Event Handling,Messagebox,Setfocus,Keystroke,实际上,这个微型Windows Form C#(.NET 3.5)应用程序在侦听事件时出现问题 我在表单上设置了两个按钮,直接调用我的两个主要函数(它们是向另一个进程窗口发送击键,并切换布尔值以显示是否已发送) 出现问题的部分是我正在监视的实际事件,以自动触发两个按钮所执行的相同功能。只有在我没有包含MessageBox.Show(“诸如此类”)的情况下,EventHandler才会失败 例如: public tester() InitializeComponent(); wsiRemote.c

实际上,这个微型Windows Form C#(.NET 3.5)应用程序在侦听事件时出现问题

我在表单上设置了两个按钮,直接调用我的两个主要函数(它们是向另一个进程窗口发送击键,并切换布尔值以显示是否已发送)

出现问题的部分是我正在监视的实际事件,以自动触发两个按钮所执行的相同功能。只有在我没有包含
MessageBox.Show(“诸如此类”)的情况下,EventHandler才会失败

例如:

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,该函数将正常启动。我注意到,如果我没有包含messagebox,发送按键并激活的窗口开始在任务栏中闪烁,因此我假设这与前台设置有关

        [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方法解决了我的问题。

“我注意到,如果我没有包含MessageBox,正在发送键并处于活动状态的窗口将在任务栏中开始闪烁。”闪烁症状听起来像是操作系统设置,防止应用程序窃取焦点。它在旧的TweakUI应用程序中可用,或者可以通过编辑注册表手动完成。目标系统是否偶然启用了此功能?谢谢您的回复,@Idle\u Mind。我只是四处看看,我不认为这是问题(据我所知)。我仍然无法解释为什么button方法工作得很好,但基于API的钩子却不行(除非调用
MessageBox.Show
)。据我所知,我认为这可能与通过事件调用利用
对象发送器、EventArgs e
的按钮有关。我将继续研究用户界面问题,并感谢您的帮助。你有别的想法吗?再次感谢你!