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

时间:2013-07-08 14:35:33

标签: c# event-handling messagebox setfocus keystroke

基本上,这个微型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,它会触发并向用户显示该框。用户单击“确定”后,该功能将正常激活。我注意到,如果我不包含消息框,正在发送密钥并激活的窗口开始在任务栏中闪烁,所以我假设它与前台设置有关。

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

如果有人有任何建议,我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

有些时候,“应用程序”的主窗口句柄不是“逻辑”主窗口的句柄(你要设置焦点),而且大多数时候,主窗口甚至是隐藏的,所以设置焦点没有任何区别。

尝试itterating Process的窗口,找到你需要设置forground的窗口。

您可以使用 Process Explorer 来调查您的应用。 (如果它是您想要采取行动的特定应用程序。)

使用:How to enumerate all windows within a process? 协助获得儿童窗户。

答案 1 :(得分:0)

MessageBox.Show(this, "my message");

将“this”传递给MessageBox.Show方法解决了我的问题。