1.在窗体放一个定时器,定时器启动时执行你的打开记事本的代码。
2.在窗体新建一个CheckKeyBoard类的实例,在 CheckKeyBoard类的KeyboardProc时间里面重置定时器
internal class CheckKeyBoard { public delegate void HookProc(int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll")] internal static extern uint GetCurrentThreadId(); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SetWindowsHookEx(IntPtr hook, HookProc callback, IntPtr hMod, uint dwThreadId); private readonly HookProc _localKeyboardHookCallback; public CheckKeyBoard() { _localKeyboardHookCallback = new HookProc(KeyboardProc); SetWindowsHookEx( new IntPtr(2), _localKeyboardHookCallback, IntPtr.Zero, GetCurrentThreadId()); } public void KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam) { //有键盘输入,重置定时器 } }
感觉您的代码实现了功能,只是看的不太明白,请问您一下,
new IntPtr(2),
IntPtr.Zero
等是代表什么意思啊?
@hunpo:
SetWindowsHookEx安装全局钩子的api;
SetWindowsHookEx(
idHook: Integer; {钩子类型}WH_KEYBOARD = 2; {系统级或线程级; 截获键盘消息}
lpfn: TFNHookProc; {函数指针}
hmod: HINST; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
dwThreadId: DWORD {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}
): HHOOK; {返回钩子的句柄; 0 表示失败}
@RyanCheng:
再想大侠指点一下,
问题1:[DllImport("user32.dll", CharSet = CharSet.Auto)] 语法怎么理解,如何使用dllimport及其参数
问题2:intptr 是怎样的指针呢,请指点
@hunpo: MSDN中对DllImportAttribute的解释是这样的:可将该属性应用于方法。DllImportAttribute 属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。(原文http://www.cnblogs.com/oflying907/archive/2008/09/23/1296639.html)
我的理解就是导入一个Dll包,声明包里的一个方法作为非托管方法,在你的代码里可以调用你声明的方法。
IntPtr结构用于表示指针或句柄的平台特定类型。
@RyanCheng: 真想拜你为师啊
定义一个全局变量用于计时
再开一个定时器,当运行超过一分钟打开记事本
再对按钮进行捕获,如是有按钮则把全局变量清零
就这么简单
我想对键盘捕获,而不是对按钮,这该怎么做?还望略加指点
@hunpo:
KeyDown事件
设置一个定时器,同时监听键盘操作,使用 HOOK,每次有按键消息就 reset 一次定时器,定时器到了就启动记事本。
您好,为了实现您说的功能,我需要引用怎样的类库或者函数呢,还望略加指点啊
@hunpo: http://www.cppblog.com/pencil/archive/2010/01/28/106577.html
在C#中使用 P/Invoke 来使用 Win32 API,我记得有个哥们用C#封装了一个。
定时间扫描事件
System.DateTime 获取本地时间 订到某一个时间点 启动程序 Timer也可以 不建议用