我对钩子不熟,请各位看看这个问题怎么解决?

Water Lee 2005-03-18 03:59:20
写一个程序要用到全局钩子,我自己不会写,从网上下了一段代码。
但是,在使用组合键时钩子就失效了。请各位帮忙看看,先谢了!

这里是我下的类的代码:
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!");
}
}
如果不使用组合键就可以,但一用组合键就不行了!
...全文
106 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fellowcheng 2005-03-18
  • 打赏
  • 举报
回复
学习

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧