在全局Hook的KeyboardHookProc方法是这样写的!
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// 侦听键盘事件
if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
{ KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,
typeof(KeyboardHookStruct));
if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
KeyDownEvent(this, e);
}
}
}
在form中引用全局钩子,当按下ctrl键时,要把背景色变为红色
private void hook_KeyDownEvent(object sender, KeyEventArgs e)
{
if (e.Control)
{
this.BackColor = Color.Red;
}
}现在在调试的时候,按下ctrl键,e.Control的值是为FALSE。这是怎么回事啊?
我要怎么才能用全局钩子模拟出ctrl键?
麻烦说下。
3Q!
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// 侦听键盘事件
if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
{ KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,
typeof(KeyboardHookStruct));
if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
KeyDownEvent(this, e);
}
}
}
在form中引用全局钩子,当按下ctrl键时,要把背景色变为红色
private void hook_KeyDownEvent(object sender, KeyEventArgs e)
{
if (e.Control)
{
this.BackColor = Color.Red;
}
}现在在调试的时候,按下ctrl键,e.Control的值是为FALSE。这是怎么回事啊?
我要怎么才能用全局钩子模拟出ctrl键?
麻烦说下。
3Q!
那在form中要怎么判断呢?
能讲细点吗?
谢谢了!
public static extern void keybd_event(
byte bVk,
byte bScan,
uint dwFlags,
uint dwExtraInfo
);//模拟键盘消息
byte VK_CONTROL=17;
byte VK_C=67;
//下面四句话就是CTRL+C
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_C, 0, 0, 0);
keybd_event(VK_C, 0, 0x2, 0);
keybd_event(VK_CONTROL, 0, 0x2, 0);
我用的Hook只能勾住像A,B,CZ这些键,不能勾住ctrl,shift,alt这些键。
怎么弄的?
哎。
还没有拦截到,谁能说下啊?
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
KeyDownEvent(this, e);
}
这段代码执行没有?如果执行了,直接从vkCode来判断Control是否按下
这个代码执行了啊,if (e.Control)不就是判断有没有control键按下没有啊,可是这些系统键我都无法判断出。
但是if(e.control)确不能,e.control的值总是false。
这样就不能判断是不是ctrl+c了,
if((e.KeyCode ==Keys.LControlKey||e.KeyCode==Keys.RControlKey)&&e.keycode==keys.C) 这样子肯定不行
只能用if(e.control&&e.keycode==keys.C)才能判断是ctrl+c吧。
为什么按下ctrl键了,e.control的值是false呢?