写一个程序要用到全局钩子,我自己不会写,从网上下了一段代码。
但是,在使用组合键时钩子就失效了。请各位帮忙看看,先谢了!这里是我下的类的代码:
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;namespace CSystemKeyHook
{
public class CHook
{
private const int WM_KEYDOWN   = 0x100;
private const int WM_KEYUP    = 0x101;
private const int WM_SYSKEYDOWN  = 0x104;
private const int WM_SYSKEYUP   = 0x105;
  
public event KeyEventHandler OnKeyDownEvent;

public event KeyEventHandler OnKeyUpEvent;

public event KeyPressEventHandler OnKeyPressEvent;

static int hKeyboardHook = 0; 

public const int WH_KEYBOARD_LL = 13; 

HookProc KeyboardHookProcedure; [StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //表示一个在1到254间的虚似键盘码
public int scanCode; //表示硬件扫描码
public int flags;  
public int time; 
public int dwExtraInfo;
}

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);


[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);   [DllImport("user32")] 
public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState,byte[] lpwTransKey, int fuState); [DllImport("user32")] 
public static extern int GetKeyboardState(byte[] pbKeyState); public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); public CHook() 
{
Start();
} //析构函数.
~CHook() 

Stop();


public void Start()
{
if(hKeyboardHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
hKeyboardHook = SetWindowsHookEx
( WH_KEYBOARD_LL, KeyboardHookProcedure, 
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0); if(hKeyboardHook == 0 ) 
{
Stop();
throw new Exception("SetWindowsHookEx ist failed.");
}
}
}

public void Stop()
{
bool retKeyboard = true;
   
if(hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;

//如果卸下钩子失败
if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx failed.");
}

private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if ((nCode >= 0) && (OnKeyDownEvent!=null || OnKeyUpEvent!=null || OnKeyPressEvent!=null))
{
KeyboardHookStruct MyKeyboardHookStruct = 
(KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
//引发OnKeyDownEvent
if ( OnKeyDownEvent!=null && ( wParam ==WM_KEYDOWN || wParam==WM_SYSKEYDOWN ))
{
Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
OnKeyDownEvent(this, e);
}
    
//引发OnKeyPressEvent
if ( OnKeyPressEvent!=null &&  wParam ==WM_KEYDOWN )
{
byte[] keyState = new byte[256];
GetKeyboardState(keyState); byte[] inBuffer= new byte[2];
if (ToAscii(MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState,
inBuffer,
MyKeyboardHookStruct.flags)==1) 
{
KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
OnKeyPressEvent(this, e);
}
}
    
//引发OnKeyUpEvent
if ( OnKeyUpEvent!=null && ( wParam ==WM_KEYUP || wParam==WM_SYSKEYUP ))
{
Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
OnKeyUpEvent(this, e);
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
}
}
}
以下是我在程序中调用的代码:
private void Form1_Load(object sender, System.EventArgs e)
{
ch=new CHook();
ch.OnKeyDownEvent+=new KeyEventHandler(OnKeyDownEvent);
}private void OnKeyDownEvent(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.KeyCode == Keys.L && (e.Alt || e.Control || e.Shift))
{
MessageBox.Show("ok!");
}
}
如果不使用组合键就可以,但一用组合键就不行了!