C# 如何编写程序监控键盘,即使程序的窗体不是当前活动窗体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如何编写程序监控键盘,即使程序的窗体不是当前活动窗体相关的知识,希望对你有一定的参考价值。

C#监控键盘,将键盘输入的内容写到记事本,即使当前窗体已经被最小化或不是活动窗体。程序都能将按下的键盘值的内容保存到记事本。
我起先的想法使用计时器,因为用计时器就能实现窗体最小化也能照常运行,
但是发觉黔驴技穷了,不知该从何入手。
3楼xbc0010249:
public int MyKeyboardProc(int nCode, int wParam, int lParam)

//在这里放置你的处理代码 return 0;

如果我要把下面这段代码加在方法里, 那么weitr.WriteLine();里怎么写
才能实现记录键盘输入?
StreamWriter weitr = new StreamWriter("Test.txt");
weitr.WriteLine();
weitr.Close();

必须使用Windows api,用键盘钩子函数截取键盘按键记录,然后把这个EXE程序注册为系统服务就能自动运行了

C#中键盘钩子的使用 [转帖]
public class Win32Hook


[DllImport("kernel32")]
public static extern int GetCurrentThreadId();

[DllImport( "user32",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(
HookType idHook,
HOOKPROC lpfn,
int hmod,
int dwThreadId);

public enum HookType

WH_KEYBOARD = 2


public delegate int HOOKPROC(int nCode, int wParam, int lParam);

public void SetHook()

// set the keyboard hook
SetWindowsHookEx(HookType.WH_KEYBOARD,
new HOOKPROC(this.MyKeyboardProc),
0,
GetCurrentThreadId());


public int MyKeyboardProc(int nCode, int wParam, int lParam)

//在这里放置你的处理代码 return 0;


使用方法
可以在Form的构造函数里放入
Win32Hook hook = new Win32Hook();
hook.SetHook();
参考技术A using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Kits.Win32API;
using Kits.Hook;

namespace WindowsApplication5

public partial class Form1 : Form

public Form1()

InitializeComponent();


private WinHook hook = new WinHook(HookType.WH_KEYBOARD_LL);
private HookProc hookProc = null;

private void Form1_Load(object sender, EventArgs e)

hookProc = new HookProc(this.MyKeyboardProc);
hook.SetWindowsHookEx(hookProc);


private int MyKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam)
KeyboardHookStruct keyInfo = (KeyboardHookStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
this.Text = ((char)keyInfo.vkCode).ToString();
return (User32.CallNextHookEx(hook.HHook,nCode,wParam,lParam));




很多东西我封装了.不过没有关系,其他的你可以使用3楼的方法,主要是不知道如何获取按键信息,你可以看我的MyKeyboardProc是怎么处理的,lParam这个参数其实是一个指向按键信息体的指针.其声明如下:

public class KeyboardHookStruct

public int dwExtraInfo;
public int flags;
public int scanCode;
public int time;
public int vkCode;

public KeyboardHookStruct();


vkCode就是按键对应的ASCII,可以转成char记录的本回答被提问者采纳
参考技术B 我应该有一段从网上下载的视频,可以捕获键盘按下的键,是用C#语言写的,而且是vs2008 环境下些的,如果那个视频还在如果您需要传给您! 参考技术C 弄个全局键盘钩子即可 参考技术D 从键盘消息钩子入手

c#的winform窗体中如何嵌套exe应用程序

参考技术A 你可以把第一个窗体Form1
传给第二个窗体
在第二个窗体中就可以操作Form1
这样循环
调用
就可以了其实也没什么啊
你在窗体Form2的属性
事件中找
closing
这个事件
在这个事件里写
form1.show();其中form1是Form1传给Form2的一个对象因为我现在在网吧
没有环境
不便给你代码
思想就是这样的
参考技术B 在界面的设计里点开属性,在窗口样式栏,有两项:
IsMdiContainer,MainMenuStrip
设置下就可以了
参考技术C (1)

用窗体的静态方法作为显示窗体和使用窗体功能的入口
一个窗体往往会显示其他窗体以实现一定的功能。通过在被调用窗体中实现一个静态函数供调用窗体使用可以简化窗体间的交互,隐蔽被调用窗体的数据,从而加强封装特性。
如主窗体为FormMain,被调用窗体为FormChild。在FormChild中实现一个静态方法:
Static
void
DoSomething()


new
FormChild.ShowDialog();
//实现功能
//…

在主窗体中调用被调用窗体的DoSomething()方法:
FormChind.DoSomething();
这样就可以显示被调用窗体并由被调用窗体执行预设的功能,并且该静态函数封装了构造和初始化被调用窗体的逻辑。程序的结构更加清晰,类的职责更加明确。
(2)

判断用户在对话框中点击的按钮
对话框的ShowDialog方法会返回DialogResult类型的返回值。DialogResult是枚举类型,通过检查该枚举值,即可知道用户是通过单击哪个按钮关闭对话框的。
例如,要检测用户是否是单击了OK按钮从而关闭文件对话框,可以使用如下代码:
if
(this.openFileDialogPhoto.ShowDialog()==DialogResult.OK)




(3)

将数据库中读取的照片文件显示在控件中
从数据库中读取照片,照片的列row.phptoImage是byte
数组类型。要将照片直接显示在控件中,而非先存储在硬盘上再调入控件显示,需要使用MemoryStream类。具体方法如下:
MemoryStream
mstream;

if(row.photoImage.Length!=0)



mstream=new
MemoryStream(row.photoImage);

this.picPhoto.Image=
new
Bitmap(mstream);


(4)

使用
Command
对象的
ExecuteScalar
方法
一般使用
Command
对象的
ExecuteReader
方法来将数据库的返回结果保存在
DataReader
中。如以下代码所示:
dbReader
=
cmd.ExecuteReader();
但如果返回结果是单个标量值,如一个整数或一个字符串,则可以执行
Command
对象的
ExecuteScalar
方法直接获取该值。
编码示例如下:
byte
b;
b
=
(byte)cmd.ExecuteScalar();
(5)


Command
对象添加参数的两种方法
这两种方法其实是
Parameters
对象的
Add
方法的两种变体。第一种方法比较简单,就是直接使用
Add
方法添加参数,并同时指定参数的类型和值。代码如下:
cmd.Parameters.Add("@EmpID",System.Data.SqlDbType.Int).Value
=
iEmpID;
另外一种方法比较复杂,它需要先声明一个
SqlParameter
类型的对象,然后使用
Add
方法添加该参数对象。这种方法便于调试。代码如下:
SqlParameter
paramEmpID
=
new
SqlParameter("@EmpID",
System.Data.SqlDbType.Int);
paramEmpID.Value
=
strSelfIntro;
cmd.Parameters.Add(paramEmpID);
(6)

解决Typed
DataSet中空字段值的问题
Typed
DataSet可以大大提高开发的效率。但是在某个字段值为空的情况下,使用Typed
DataSet读取该字段会引发系统异常。要解决这个问题有两种方法:
1)

在数据库中为所有运行为空的字段设置缺省值
2)

修改VS.NET自动生成的XSD文件
在这里仅介绍第二种方法。对于值可以为空的字段,XSD文件中原来的描述应该类似如下代码(其中DeptName、Title和Telephone字段在数据库中可以为空值):
<xs:elementname="Name"type="xs:string"/>
<xs:elementname="LoginName"type="xs:string"/>
<xs:elementname="Email"type="xs:string"/>
<xs:elementname="DeptName"type="xs:string"minOccurs="0"/>
<xs:elementname="Title"type="xs:string"minOccurs="0"/>
<xs:elementname="Telephone"
文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007921/72800.html

以上是关于C# 如何编写程序监控键盘,即使程序的窗体不是当前活动窗体的主要内容,如果未能解决你的问题,请参考以下文章

C#程序设计窗体如何将导入的图片背景变成透明?

c# windows 窗体 如何 设置菜单的权限

编写一个C#控制台应用程序,从键盘输入年份,判断此年份是否闰年。

C#中如何获得当前应用程序路径?

c# winform程序,判断是不是打开同一个窗口的问题。

C#获取当前窗体句柄及该窗体里的信息