WINCE6.0 键盘钩子 SetWindowsHookEx返回0,安装钩子失败,求解

周美文 2014-01-10 05:18:18
背景是参照网上用 C#写了个键盘钩子类,然后到wince6.0系统下运行程序发现 键盘钩子安装失败,有哪位对这方面有所了解的啊,还请帮忙分析分析!代码如下,其中
hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0);为0

public class HookKeyClass
{
public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam);
public delegate void KeyEventHandler(int KeyValue);
public event KeyEventHandler KeyEvent;
private HookKeyProc hookKeyDeleg;
private int hHookKey = 0;
public HookKeyClass()
{
Start();
}

~HookKeyClass()
{
Stop();
}


#region public methods
//安装钩子
private void Start()
{
if (hHookKey != 0)
{
//Unhook the previouse one
this.Stop();
}

hookKeyDeleg = new HookKeyProc(HookKeyProcedure);
hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0);
if (hHookKey == 0)
{
throw new SystemException("Failed acquiring of the hook.");
}
}

//拆除钩子
private void Stop()
{
UnhookWindowsHookEx(hHookKey);
}

#endregion


#region protected and private methods
private int HookKeyProcedure(int code, IntPtr wParam, IntPtr lParam)
{
switch ((int)wParam)
{
case 257: //按下响应
KBDLLHOOKSTRUCT hookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
if (code < 0)
{
return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);
}
//if(hookStruct.vkCode==201 |
KeyEvent(hookStruct.vkCode);
break;
case 256:

break;

default: break;
}

return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);
}
#endregion


#region P/Invoke declarations

[DllImport("coredll.dll")]
private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, IntPtr hInstance, int m);
//private static extern int SetWindowsHookEx(int type, HookMouseProc HookMouseProc, IntPtr hInstance, int m);

[DllImport("coredll.dll")]
private static extern IntPtr GetModuleHandle(string mod);


[DllImport("coredll.dll")]
private static extern int CallNextHookEx(HookKeyProc hhk, int nCode, IntPtr wParam, IntPtr lParam);


[DllImport("coredll.dll")]
private static extern int GetCurrentThreadId();

[DllImport("coredll.dll", SetLastError = true)]
private static extern int UnhookWindowsHookEx(int idHook);
private struct KBDLLHOOKSTRUCT
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public IntPtr dwExtraInfo;
}

const int WH_KEYBOARD_LL = 20;
public class KeyBoardInfo
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
}
#endregion
}
...全文
151 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheery_an 2014-01-10
  • 打赏
  • 举报
回复
先网上查下吧,比如:http://www.csharpwin.com/csharpspace/3766r5747.shtml
周美文 2014-01-10
  • 打赏
  • 举报
回复
以前也没接触过wince系统、钩子什么的,着实有些不知从哪下手
内容概要:本文档为一份《计算机程序设计语言(C++)》课程的实验报告,涵盖了从基础语法到面向对象编程的多个实验内容。实验内容包括基础语法练习(如银行存款计算、数值比较、科学计算)、控制结构(分支与循环,如闰年判断、素数判定、Kaprekar黑洞数)、数组操作(一维与二维数组的排序、查找、极值计算、杨辉三角)、函数定义与应用(递归、参数传递、函数重载)以及面向对象编程(类与对象的设计、继承、多态性、文件操作)。文档详细展示了每个实验的任务描述、具体C++代码实现、测试结果及实验分析,体现了从简单到复杂、逐步深入的学习路径。; 适合人群:具备C++基础语法知识,正在学习或巩固程序设计课程的在校大学生及初级编程学习者。; 使用场景及目标:①作为C++课程的配套实验指导材料,帮助学生通过实践掌握编程基础知识和核心算法;②用于自学练习,提升对循环、数组、函数和面向对象等核心概念的理解与编码能力。; 阅读建议:学习者应结合文档中的代码实例,动手在编程环境中逐一实现并调试,重点关注代码逻辑、边界条件处理和算法效率,通过对比预期输出与实际输出加深对知识点的掌握。

111,129

社区成员

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

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

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