c#如何检测其他的软件的按键按下

c#如何检测其他的软件的按键按下,第1张

你需要使用下面的API函数,并建立一个需要检测的按键 List。

把检测按键放到 Timer 里面每秒肢腊检测 30 次以上就能监听全局按键。

【API函数】

/// <summary>

/// GetAsyncKeyState函数返回的是指定虚拟键瞬时的状态值,它有四种返回值:

///<para></para>0---键未被按下,而且键也未被按过(自上次调用GetAsyncKeyState后);

///<para></para>1---键抬起瞬间,在此之前键曾经被按过;

///<para></para>-32768(即16进制数&H8000) --- 键按下瞬间,但在此之前键未被按过;

///<para></para>-32767(即16进制数&H8001) --- 键按下持续,在此之前键也曾经被按过。

/// </summary>

[System.Runtime.InteropServices.DllImport("user32.dll")]

public static extern int GetAsyncKeyState ( int vKey )

/// <summary>GetCursorPos函数返回鼠标位置</summary>

[System.Runtime.InteropServices.DllImport("user32.dll")]

public static extern int GetCursorPos (ref MOUSEPOINT lpPoint )

/// <summary>返回指定虚拟码的按键状态。

/// <para>参见〈<see cref="EKeyState"/>〉</para>贺空

/// </summary>

public int 获取按键状态 ( int 键) { return GetAsyncKeyState(键)}

/// <summary>获取并返回鼠标位置</summary>

public MOUSEPOINT 鼠标位置() {

MOUSEPOINT p = new MOUSEPOINT()

var k = 0

k = GetCursorPos(ref p)

return p

}

/// <summary>表示鼠标在屏幕位置的结构,为了使用API函数而定制</summary>

[StructLayout(LayoutKind.Sequential)]

public struct MOUSEPOINT{

public int X

public int Y

public MOUSEPOINT(int x, int y) {

this.X = x

this.Y = y

}

}

【键位表】

public enum EKey {

//鼠标b

None = 0,

鼠标左键 = 1, LButton = 0x1,

鼠标右键 = 2, RButton = 0x2,

取消 = 3, Cancel = 0x3,

鼠标中键 = 4, MButton = 0x4,

鼠标侧键1 = 5, XButton1 = 0x5,

鼠标侧键2 = 6, XButton2 = 0x6,

//功能键

退格 = 8, Back = 0x8,

跳格 = 9, Tab = 0x9,

LineFeed = 0xA, //10,

Clear = 0xC, //12,

回车 = 13, Enter = 0xD,

退出 = 27, Esc = 0x1B,

空格历拍滑 = 32, Space = 0x20,

CapsLock = 0x14,

ScrollLock = 0x91,

NumLock = 0x90,

//组合键

Modifiers = -65536,

按Shift = 16, Shift = 0x10,

按Ctrl = 17, Ctrl = 0x11,

按Alt = 18, Menu = 0x12, /*ALT键码名为Menu*/

按住Shift = 65536, //0x10000,

按住Ctrl = 131072, //0x20000,

按住Alt = 262144, //0x40000,

左Shift = 160, LShift = 0xA0,

右Shift = 161, RShift = 0xA1,

左Ctrl = 162, LControl = 0xA2,

右Ctrl = 163, RControl = 0xA3,

左Alt = 164, LMENU = 0xA4,

右Alt = 165, RMENU = 0xA5,

左Win = 91, LWIN = 0x5B,

右Win = 92, RWIN = 0x5C,

目录 = 93, Apps = 0x5D,

//键盘上部

分号 = 186, 冒号 = 186, OEMSemicolon = 0xBA, OEM1 = 0xBA, /* : */

等号 = 187, 加号 = 187, OEMPlus = 0xBB, /* = + */

逗号 = 188, 小于号 = 188, OEMComma = 0xBC, /* , <*/

减号 = 189, 下划线 = 189, OEMinus = 0xBD, /* = + */

句号 = 190, 大于号 = 190, OEMPeriod = 0XBE, /* . >*/

斜杠 = 191, 问号 = 191, OEMQuestion = 0xBF, OEM2 = 0xBF, /* / ? */

重音 = 192, 波浪 = 192, OEMtilde = 0xC0, OEM3 = 0xC0, /* ` ~ */

左方括号 = 219, 左大括号 = 219, OEMOpenBreackets = 0xDB, OEM4 = 0xDB, /* [ { */

反斜杠 = 220, 竖线 = 220, OEMPipe = 0xDC, OEM5 = 0xDC, /* \ | */

右方括号 = 221, 右大括号 = 221, OEMCloseBreackets = 0xDD, OEM6 = 0xDD, /* ] } */

引号 = 222, 双引号 = 222, 单引号 = 222, OEMQuptes = 0xDE, OEM7 = 0xDE, /* ' " */

尖括号 = 223, OEMBackslash = 0xDF, /* 102键盘上的尖括号或反斜杠键 */

//键盘中部

截屏 = 44, PrintScreen = 0x2C,

暂停 = 19, Pause = 0x13, Break = 0x13, /*BREAK为自定义*/

休眠 = 95, Sleep = 0x5F,

Insert = 0x2D,

Home = 0x24,

End = 0x23,

Delete = 0x2E,

PageDown = 0x22,

PageUp = 0x21,

左键 = 37, LEFT = 0x25,

上键 = 38, UP = 0x26,

右键 = 39, RIGHT = 0x27,

下键 = 40, DOWN = 0x28,

//小键盘

侧0 = 96, Numpad0 = 0x60, NumpadInsert = 96, /*NumpadInsert为自定义*/

侧1 = 97, Numpad1 = 0x61, NumpadDelete = 97, /*NumpadDelete为自定义*/

侧2 = 98, Numpad2 = 0x62, NumpadDown = 98, /*NumpadDown为自定义*/

侧3 = 99, Numpad3 = 0x63,

侧4 = 100, Numpad4 = 0x64, NumpadLeft = 100, /*NumpadLeft为自定义*/

侧5 = 101, Numpad5 = 0x65,

侧6 = 102, Numpad6 = 0x66, NumpadRight = 102, /*NumpadRight为自定义*/

侧7 = 103, Numpad7 = 0x67,

侧8 = 104, Numpad8 = 0x68, NumpadUp = 104, /*NumpadUp为自定义*/

侧9 = 105, Numpad9 = 0x69,

侧乘 = 106, Mutiply = 0x6A,

侧加 = 107, Add = 0x6B,

侧回车 = 108, Separator = 0x6C,

侧减 = 109, Subtract = 0x6D,

侧点 = 110, Decimal = 0x6E,

侧除 = 111, Divide = 0x6F,

//功能键

F1 = 0x70,

F2 = 0x71,

F3 = 0x72,

F4 = 0x73,

F5 = 0x74,

F6 = 0x75,

F7 = 0x76,

F8 = 0x77,

F9 = 120,

F10 = 0x79,

F11 = 0x7A,

F12 = 0x7B,

F13 = 0x7C,

F14 = 0x7D,

F15 = 0x7E,

F16 = 0x7F,

F17 = 0x80,

F18 = 0x81,

F19 = 130,

F20 = 0x83,

F21 = 0x84,

F22 = 0x85,

F23 = 0x86,

F24 = 0x87,

//数字字母

数0 = 48, D0 = 0x30,

数1 = 49, D1 = 0x31,

数2 = 50, D2 = 0x32,

数3 = 51, D3 = 0x33,

数4 = 52, D4 = 0x34,

数5 = 53, D5 = 0x35,

数6 = 54, D6 = 0x36,

数7 = 55, D7 = 0x37,

数8 = 56, D8 = 0x38,

数9 = 57, D9 = 0x39,

A = 65, //0x41,

B = 66, //0x42,

C = 67, //0x43,

D = 68, //0x44,

E = 69, //0x45,

F = 70, //0x46,

G = 71, //0x47,

H = 72, //0x48,

I = 73, //0x49,

J = 74, //0x4A,

K = 75, //0x4B,

L = 76, //0x4C,

M = 77, //0x4D,

N = 78, //0x4E,

O = 79, //0x4F,

P = 80, //0x50,

Q = 81, //0x51,

R = 82, //0x52,

S = 83, //0x53,

T = 84, //0x54,

U = 85, //0x55,

V = 86, //0x56,

W = 87, //0x57,

X = 88, //0x58,

Y = 89, //0x59,

Z = 90, //0x5A,

//其他

Attn = 0xF6,

BrowserBack = 0xA6,

BrowserFavorites = 0xAB,

BrowserForward = 0xA7,

BrowserHome = 0xAC,

BrowserRefresh = 0xA8,

BrowserSearch = 170,

BrowserStop = 0xA9,

Crsel = 0xF7,

EraseEof = 0xF9,

Exsel = 0xF8,

FinalMode = 0x18,

HanguelMode = 0x15,

HangulMode = 0x15,

HanjaMode = 0x19,

帮助 = 47, Help = 0x2F,

IMEAccept = 30,

IMEAceept = 30,

IMEConvert = 0x1C,

IMEModeChange = 0x1F,

IMENonconvert = 0x1D,

JunjaMode = 0x17,

KanaMode = 0x15,

KanjiMode = 0x19,

KeyCode = 0xFFFF,

LaunchApplication1 = 0xB6,

LaunchApplication2 = 0xB7,

LaunchMail = 180,

音量减小 = 0xAE,

音量禁用 = 0xAD,

音量放大 = 0xAF,

选择 = 41, Select = 0x29,

打印 = 42, Print = 0x2A,

Execute = 0x2B,

MediaSelect = 0xB5,

MediaNextTrack = 0xB0,

MediaPlayPause = 0xB3,

MediaPreviousTrack = 0xB1,

MediaStop = 0xB2,

播放 = 250, Play = 0xFA,

OemBackslash = 0xE2,

OemClear = 0xFE,

Pa1 = 0xFD,

Packet = 0xE7,

Prior = 0x21,

ProcessKey = 0xE5,

NoName = 0xFC,

Zoom = 0xFB,

}

通常很多情况下,会有这样的事情改慎,就是:

我们在运行某些程序的时候,发现按钮置灰了,比如购买版权或者输入序列号才能够获得访问权限。某个按钮才允许点击。

其实所有的这些东西都是 别的人或者公司利用一些编程语言调用windows的函数,实现的。所以如果我们也能调用windows的函数,那么我们就能够执行一些按钮或者某些东西背后的函数。

自己的mfc还暂时 用不了,不过 可以 试试这个。

调出这个界面,看到有一个置灰的设置按钮。我们可以试着调用这个后面的函数。

/*如何调出来?【在win7环境下】

打开控制面板

点击鼠标。*/

然后利用vs的工具中的spy++ x64。

进入查找窗口。携蔽

拖住这个到刚刚鼠标的那个置灰的按钮上面。就可以得到一个句柄。

句柄【在我理解,就是一个话把子,怎么解释,就是,别人说一件事儿,你得顺着往下说才能把话接下来,然后完成你想说的东西。在程序里面,执行到这里,有这样一个句柄,允许我们说话了,我们就从这一点开始,顺着往下说,往往就能得到我们想要的结果】

所以得到了句柄之后。我们可以新建一个工程。

#include <windows.h>

int main(){

SendMessage(0x001607E6,WM_LBUTTONDOWN,0,0)

SendMessage(0x001607E6,WM_LBUTTONUP,0,0)

return 0

}

//在HWND的第一个参数里面输入刚刚的句柄。

//猜测 第二个参数 是 WindowManager_LeftButtonDown,就是窗口管理器左键按钮点下。

//然后左键按钮d起。

就强核隐敬制的往刚刚不能执行的函数里面发送了一个信息。前面的引文介绍说,这就是调用了windows底层的一些函数,如果按钮可以点击,则鼠标点击,按钮按下,当需要注册的时候,或者需要序列号的时候我们并没有,就不能点击。但是当我们给他发送一条消息以后,是不是问题就解决了。

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit led1 = P2^0//定义管脚;

sbit led2 = P2^1

sbit led3 = P2^2

sbit led4 = 贺缺P2^3

sbit led5 = P2^4

sbit led6 = P2^5

sbit key  = P1^0

uchar tcount=0,count=0//定义时间变量和按键计数变量;

void Delay(uchar i)//机械延时;

{

while(--i)

}

void LedLight(void)//LED控制函数;

{

switch(count)

{

case 3 : led1 = 0break//3下时,LED1亮;

case 5 : led2 = 0break//5下时,LED2亮;

case 7 : led3 = 0break//7下时,LED3亮;

case 9 : led4 = 0break//9下时,LED4亮;

case 11: led5 = 0break//11下时,LED5亮;

case 13: led6 = 0break//13下时,LED6亮;

default: P2   = 0xffbreak//其余的都不亮;

}

}

void InitTimer0(void)//定时器0初始化;

{

TMOD = 0x00

TH0 = (65536-50000)/256

TL0 = (65536-50000)%256

TR0 = 1

}

void main(void)//主猛芦函数

{

InitTimer0()

while(1)//无限循环

{

if(key==0)//检查按键是否枝拍带按下;

{

Delay(10)//机械延时

if(key==0){count++}//按键计数

while(key==0)

}

if(TF0==1)//复位定时器0

{

TF0=0

TH0 = (65536-50000)/256

TL0 = (65536-50000)%256

tcount++

if(tcount==20)//1秒的时间

{

LedLight()

Delay(100)

count=0//复位按键计数变量

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8256766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存