首页 新闻 会员 周边

C# 实现在一段时间内没有任何按键,自动运行某个程序的功能

0
悬赏园豆:15 [已解决问题] 解决于 2012-12-26 10:56

比如,在1分种内,没有任何按键的操作,我想程序自动打开一个记事本程序;

这样的程序,应该怎么实现呢,请给出思路和简单的实现代码

绝对菜鸟的主页 绝对菜鸟 | 初学一级 | 园豆:27
提问于:2012-12-20 17:26
< >
分享
最佳答案
0
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)         {             //有键盘输入,重置定时器         }     }
收获园豆:15
RyanCheng | 菜鸟二级 |园豆:474 | 2012-12-21 17:22

感觉您的代码实现了功能,只是看的不太明白,请问您一下,

new IntPtr(2),

IntPtr.Zero

等是代表什么意思啊?

绝对菜鸟 | 园豆:27 (初学一级) | 2012-12-23 13:11

@hunpo: 

SetWindowsHookEx安装全局钩子的api;

SetWindowsHookEx(
  idHook: Integer;   {钩子类型}WH_KEYBOARD = 2;  {系统级或线程级; 截获键盘消息}
  lpfn: TFNHookProc; {函数指针}
  hmod: HINST;       {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
  dwThreadId: DWORD  {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}
): HHOOK;            {返回钩子的句柄; 0 表示失败}

RyanCheng | 园豆:474 (菜鸟二级) | 2012-12-25 09:03

@RyanCheng: 

再想大侠指点一下,

问题1:[DllImport("user32.dll", CharSet = CharSet.Auto)] 语法怎么理解,如何使用dllimport及其参数
问题2:intptr 是怎样的指针呢,请指点
绝对菜鸟 | 园豆:27 (初学一级) | 2012-12-25 11:03

@hunpo: MSDN中对DllImportAttribute的解释是这样的:可将该属性应用于方法。DllImportAttribute 属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。(原文http://www.cnblogs.com/oflying907/archive/2008/09/23/1296639.html)

我的理解就是导入一个Dll包,声明包里的一个方法作为非托管方法,在你的代码里可以调用你声明的方法。

 

IntPtr结构用于表示指针或句柄的平台特定类型。

RyanCheng | 园豆:474 (菜鸟二级) | 2012-12-25 19:07

@RyanCheng: 真想拜你为师啊

绝对菜鸟 | 园豆:27 (初学一级) | 2012-12-26 10:54
其他回答(4)
0

定义一个全局变量用于计时

再开一个定时器,当运行超过一分钟打开记事本

再对按钮进行捕获,如是有按钮则把全局变量清零

 

就这么简单

Rich.T | 园豆:3440 (老鸟四级) | 2012-12-20 17:32

我想对键盘捕获,而不是对按钮,这该怎么做?还望略加指点

支持(0) 反对(0) 绝对菜鸟 | 园豆:27 (初学一级) | 2012-12-21 10:30

@hunpo: 

KeyDown事件

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2012-12-21 10:31
0

设置一个定时器,同时监听键盘操作,使用 HOOK,每次有按键消息就 reset 一次定时器,定时器到了就启动记事本。

Launcher | 园豆:45045 (高人七级) | 2012-12-20 17:33

您好,为了实现您说的功能,我需要引用怎样的类库或者函数呢,还望略加指点啊

支持(0) 反对(0) 绝对菜鸟 | 园豆:27 (初学一级) | 2012-12-21 10:28

@hunpo: http://www.cppblog.com/pencil/archive/2010/01/28/106577.html

在C#中使用 P/Invoke 来使用 Win32 API,我记得有个哥们用C#封装了一个。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2012-12-21 10:33
0

定时间扫描事件

jason2013 | 园豆:1998 (小虾三级) | 2012-12-21 08:19
0

System.DateTime 获取本地时间 订到某一个时间点 启动程序 Timer也可以 不建议用

权啊权 | 园豆:204 (菜鸟二级) | 2020-09-29 11:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册