2010-12-10 37 views
1

我需要编写一个全局截取Alt + Shift + S的应用程序。如何在C#中实现全局热键?

我做什么是我创建了设置全局钩子DLL:

namespace Hotkeydll 
{ 
    public class MyHotKey 
    { 
     public static void setHooks() 
     { 
      KeyboardHookProcedure = new HookProc(KeyboardHookProc); 
      hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); 
     } 

     private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) 
     { 
      //write something into file 
     } 


    } 
} 

然后我创建了加载这个DLL,并设置钩子程序:

using Hotkeydll; 
namespace IWFHotkeyStarter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyHotKey.setHooks(); 
     } 
    } 
} 

现在的问题是,热键不起作用。

它看起来像DLL没有永久加载到内存中。我看到我可以从文件系统中删除该dll文件。

那么请告诉我我做错了什么?

我应该用不同的方法吗?

谢谢。

+0

什么是您的PInvoke的代码看起来像'SetWindowsHookEx' – SwDevMan81 2010-12-10 16:37:28

+1

这可能是有益的http://www.codeproject.com/KB/cs/globalhook.aspx – fardjad 2010-12-10 17:53:12

回答

1

您的Main()方法设置挂钩,然后立即退出并终止程序。此外,你需要一个消息循环来使钩子回调工作。这需要Windows窗体或WPF应用程序。现在使用真正的热键而不是挂钩也成为一种选择。例如,检查this thread,C#在页面的下方。

0

键盘挂钩通常不是获取全局热键的正确方法。如果可能,使用RegisterHotkey

+0

笑,that's C++而不是C# – Paedow 2012-10-22 22:30:16

+0

@Paedow这Windows API。你需要使用拟合的p/invoke方法,但这并不困难。 – CodesInChaos 2012-10-23 06:38:50

+0

这就是我不擅长的事情,因为我从未学过 – Paedow 2012-10-23 13:46:28