C# - 设置前景窗口并使其聚焦

时间:2015-04-06 20:02:50

标签: c# wpf focus foreground

我试图制作一个停留在后台的WPF应用程序,并在识别按键时开始工作。 我希望它大部分时间都隐藏,按下字母键时显示,并在按下空格键时消失。

我使用以下代码:

void kbdManager_LetterPressed(object sender, KeyPressedEventArgs args)
{
    IntPtr hwnd = (IntPtr)User.GetForegroundWindow();

    // Logic..

    this.Show();

    // These worked a few times but don't anymore..
    // User.SetForegroundWindow(hwnd);
    // User.SetFocus(hwnd);
    // User.SwitchToThisWindow(hwnd, true);
    // User.SetActiveWindow(hwnd);
}

void kbdManager_SpacePressed(object sender, KeyPressedEventArgs args)
{
    IntPtr hwnd = (IntPtr)User.GetForegroundWindow();

    this.Hide();

    // It seems this.Hide changes the focus?
    User.SetForegroundWindow(hwnd);
}

 [DllImport("user32")]
 public static extern int SetForegroundWindow(HWND hwnd);

 [DllImport("user32")]
 public static extern int GetForegroundWindow();

为了检查GetForegroundWindow()是否真的有效,我使用了user32.dll中的GetWindowText()方法,它似乎在大多数情况下都能正常工作。

我的问题是焦点 - 弹出我的应用程序时,我希望它显示(并保持可见,Topmost属性设置为True),然后将焦点返回到我输入的窗口,但我的应用程序得到焦点。

为了解决这个问题,我尝试使用SetForegroundWindow(),SwitchToThisWindow(),SetFocus()和SetActiveWindow()。它们似乎都不适合我。焦点偶尔会回到主窗口,但并非总是如此。我甚至尝试了不同的组合,但它仍然没有始终如一地工作。

我认为这可能与我使用我下载的键盘监听器类处理击键的事实有关,因为调试器总是把我带到那里 - 即使我在上面显示的方法中有断点。 / p>

有人可以帮忙吗?

0 个答案:

没有答案