从后台进程启动应用程序

时间:2012-11-10 08:57:53

标签: c# wpf hotkeys shellexecute process.start

我正在使用一个基于WPF的小程序,通过使用挂钩实现的系统级热键来启动应用程序。我正在C#和Visual Studio 2010中实现它。

当我检测到特定的按键时,我使用Process.Start(...)来运行应用程序。这在Visual Studio处于活动状态时工作正常,将新应用程序置于具有输入焦点的前台,正如我所料。如果我的启动器在后台(在另一个活动程序后面),它仍会检测到密钥并在其他所有内容之前正确启动应用程序。

问题是,当我在没有Visual Studio激活的情况下运行启动器,并且我的启动器应用程序不在前面时,它也不会启动应用程序。它们出现在启动器前面,但在活动应用程序后面。

我可以看到其他软件,比如AutoHotkey,能够通过这种行为进行热键启动,但我看不出我做错了什么。

更新:刚刚找到了解决此问题的解决方案,该解决方案适用于我的开发环境。我首先使用启动器主窗口句柄通过Windows API RegisterHotKey注册一个全局热键。密钥可以是任何密钥,但应该是通常不存在的密钥,在我的情况下是F24。然后,每当我通过应该启动应用程序的钩子检测到按键时,我首先调用keybd_event来'假冒'热键的按键。

对于WPF使用:

keybd_event((byte)KeyInterop.VirtualKeyFromKey(Key.F24),0,KEYEVENTF_KEYUP,0);

对于WinForms使用:

keybd_event((byte)Keys.F24,0,KEYEVENTF_KEYUP,0);

这将为启动器带来足够的重点,以便Process.Start(...)使执行的程序在前面。它不会将启动器窗口置于前面,也不会使启动器接受输入。

如果在keybd_event()之后在主窗口上调用Activate(),则会将主窗口置于前面并允许键盘输入,就像用户已切换任务一样。

0 个答案:

没有答案