C Sharp钩子问题。。。请朋友进来帮帮忙

Jave.Lin 2008-10-12 12:14:31
using System; 
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
namespace WindowsApplication4
{
public class KeyHook
{
private Form1 f1 = null;
public KeyHook(Form1 form)
{
Start();
f1 = form;
}

~KeyHook()
{
Stop();
}

public const int WH_KEYBOARD_LL = 13;
public const int WM_KEYDOWN = 0x100;

private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;

public event KeyEventHandler KeyDown;

public event KeyEventHandler KeyUp;

public event KeyEventHandler KeyPress;

public static bool flag;


public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);

public static int hKeyboardHook = 0;
HookProc KeyboardHookProcedure;

[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}

[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode;

public int scanCode;

public int flags;

public int time;

public int dwExtraInfo;

}

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

[DllImport("user32.dll")]
public static extern bool UnhookWindowsHookEx(int idHook);

[DllImport("user32.dll")]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);

public void Start()
{
//install hook
if (hKeyboardHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); }
}
public void Stop()
{
if (hKeyboardHook != 0)
{
bool retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
}

public int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{

int r = CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
// it was ok and someone listens to events
if ((nCode >= 0) && (KeyDown != null || KeyUp != null || KeyPress != null))
{

KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
if (KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN && wParam == WM_SYSKEYDOWN))
{
//if ((wParam >= 'A' && wParam <= 'Z') || (wParam >= 'a' && wParam <= 'z') || (wParam >= '0' && wParam <= '9'))
//{
// return wParam;
// //Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
// //KeyEventArgs e = new KeyEventArgs(keyData);
// //f1.Text += e.KeyCode;
// //Console.WriteLine(e.KeyValue);
//}
////return 1;
return 1;
}
}
return r;
}
}
}


代码里。。。深蓝色的那个hKeyboardHook值。。。为啥老是0值。。。

也就是问。。。SetWindowsHookEx怎么老是返回0值的?

请朋友帮帮忙,感激不尽。
...全文
82 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jave.Lin 2008-10-13
  • 打赏
  • 举报
回复
[color=#333399]hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); [/color]

以上这句话是我在楼顶说的深蓝色语句...

因为我在Code下,颜色代码标志转不了...

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);


就是这句话的hKeyboardHook......我打了个断点测试了...老是返回是0值...

我就觉得奇怪了...我在VS2003下,运行 的是非0值,而我在VS2005运行就不是了...返回的就是0值...

有点感觉是VS版本问题...

还是说,是SetWindowsHookEx()的问题?

希望各位朋友帮忙一下...

谢谢...
pvgyetg 2008-10-13
  • 打赏
  • 举报
回复
友情UP

111,098

社区成员

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

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

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