【问题标题】:Global KeyHook in WPF applicationWPF 应用程序中的全局 KeyHook
【发布时间】:2009-12-28 15:39:15
【问题描述】:

每当用户按下“window key + s”时,我都需要我的 WPF 应用程序获得焦点。

我的解决方案是使用 SetWindowsHookEx 挂钩键盘事件。但是我返回的句柄始终为 0。当我调用 GetLastWin32Error 时,该值也是 0(即它实际上报告上一个操作成功)

_hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookFunction, _hinstance, 0);
if (_hookHandle == IntPtr.Zero)
 throw new Win32Exception(Marshal.GetLastWin32Error()); 

(不用说 _hinstance 有一个有效值,_hookFunction 也是如此)

有什么想法吗?其他解决方案?

谢谢。

【问题讨论】:

  • 能否提供 P/Invoke 签名和 WH_KEYBOARD_LL 的值?
  • [DllImport("user32.dll",SetLastError=true)] private static extern IntPtr SetWindowsHookEx(HookType code, HookProc func, IntPtr instance, int threadID); WH_KEYBOARD_LL = 13

标签: c# .net wpf winapi


【解决方案1】:

尝试使用它来获取 HINSTANCE:

Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);

【讨论】:

  • 这是我使用的确切代码,它返回一个有效值。
【解决方案2】:

如果您只需要处理特定的组合键,那么最好使用热键。这显示了如何设置热键:Hotkeys

【讨论】:

  • 这显示了如何在 WPF 中挂钩 WndProc:blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx
  • 除非我遗漏了什么,否则挂钩到 WndProc 只能在我的窗口处于活动状态时拦截消息。我的重点是在用户在另一个窗口中工作时获得焦点?我记错了吗?
  • winforms中的WndProc一直拦截消息。我确信它在 WPF 中的工作方式相同。
  • 但是你如何让它拦截不定向到你的应用程序的消息?这就是钩子背后的想法......
  • 你看过我发布的链接了吗?
【解决方案3】:

Here 是 C# 中低级键盘钩子的好文章。这可能有一些你遗漏的东西。

【讨论】:

    【解决方案4】:

    我在我的应用程序中使用了this hokey 代码,不仅可以通过热键为应用程序带来焦点,还可以通过热键启动应用程序。因此,就像您按 Win+E 启动 Windows 资源管理器一样,您可以按 Win+S 启动您的应用程序。很有用。

    http://code.google.com/p/blinkln/source/browse/trunk/HotKey.cs?r=12

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2011-11-19
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多