C# 如何编写程序监控键盘,即使程序的窗体不是当前活动窗体
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(); 展开
我起先的想法使用计时器,因为用计时器就能实现窗体最小化也能照常运行,
但是发觉黔驴技穷了,不知该从何入手。
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(); 展开
6个回答
展开全部
必须使用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();
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();
展开全部
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记录的
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记录的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我应该有一段从网上下载的视频,可以捕获键盘按下的键,是用C#语言写的,而且是vs2008 环境下些的,如果那个视频还在如果您需要传给您!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
弄个全局键盘钩子即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从键盘消息钩子入手
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询