VC模拟鼠标键盘输入

合集下载

C语言实现模拟键盘输入

C语言实现模拟键盘输入

C语言实现模拟键盘输入keybd_event functionSynthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.Note This function has been superseded. Use SendInput instead.SyntaxC++VOID WINAPI keybd_event(_In_ BYTE bVk,_In_ BYTE bScan,_In_ DWORD dwFlags,_In_ ULONG_PTR dwExtraInfo);ParametersbVk [in]Type: BYTEA virtual-key code. The code must be a value in the range 1 to 254. For a complete list, see Virtual Key Codes.bScan [in]Type: BYTEA hardware scan code for the key.dwFlags [in]Type: DWORDControls various aspects of function operation. This parameter can be one or more of the following values.Value MeaningKEYEVENTF_EXTENDEDKEY 0x0001 If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).KEYEVENTF_KEYUP 0x0002 If specified, the key is being released. If not specified, the key is being depressed.dwExtraInfo [in]Type: ULONG_PTRAn additional value associated with the key stroke. Return valueThis function does not return a value.RemarksAn application can simulate a press of the PRINTSCRN key in order to obtain a screen snapshot and save it to the clipboard. To do this, call keybd_event with the bVk parameter set to VK_SNAPSHOT.ExamplesThe following sample program toggles the NUM LOCK light by using keybd_event with a virtual key of VK_NUMLOCK. It takes a Boolean value that indicates whether the light should be turned off (FALSE) or on (TRUE). The same technique can be used for the CAPS LOCK key (VK_CAPITAL) and the SCROLL LOCK key (VK_SCROLL).#include <windows.h>void SetNumLock( BOOL bState ){BYTE keyState[256];GetKeyboardState((LPBYTE)&keyState);if( (bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)) ){// Simulate a key presskeybd_event( VK_NUMLOCK,0x45,KEYEVENTF_EXTENDEDKEY | 0,0 );// Simulate a key releasekeybd_event( VK_NUMLOCK,0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);}}void main(){SetNumLock( TRUE );}RequirementsMinimum supportedclient Windows 2000 Professional [desktop apps only]Minimum supportedWindows 2000 Server [desktop apps only] serverHeader Winuser.h (include Windows.h)Library User32.libDLL User32.dllScan CodesKey Scan Code~ ` 29! 1 2@ 2 3# 3 4$ 4 5% 5 6^ 6 7& 7 8* 8 9( 9 0A) 0 0B_ - 0C+ = 0DBackspace 0ETab 0FQ 10W 11E 12R 13T 14Y 15U 16I 17O 18P 19{ [ 1A} ] 1B| \ 2B Caps Lock 3A A 1ES 1FD 20F 21G 22H 23J 24K 25L 26: ; 27“ ' 28 Enter 1CL SHIFT 2AZ 2CX 2DC 2EV 2FB 30N 31M 32< , 33> . 34/ 35R SHIFT 36L CTRL 1DL ALT 38Space Bar 39R ALT E0 38R CTRL E0 1D Insert E0 52 Delete E0 53L Arrow E0 4B Home E0 47End E0 4FUp Arrow E0 48 Dn Arrow E0 50 Page Up E0 49 Page Down E0 51 R Arrow E0 4D Num Lock 45 Numeric 7 47 Numeric 4 4B Numeric 1 4F Numeric / E0 35 Numeric 8 48 Numeric 5 4C Numeric 2 50 Numeric 0 52 Numeric * 37 Numeric 9 49 Numeric 6 4D Numeric 3 51 Numeric . 53Numeric - 4A Numeric + 4E Numeric Enter E0 1CEsc 1F1 3BF2 3CF3 3DF4 3EF5 3FF6 40F7 41F8 42F9 43F10 44F11 57F12 58Print Screen ??Scroll Lock 46Pause ??Left Win E0 5B Right Win E0 5C Application E0 5D ACPI Power E0 5E ACPI Sleep E0 5F ACPI Wake E0 63。

VC 模拟鼠标和键盘输入

VC 模拟鼠标和键盘输入

VC 模拟鼠标和键盘输入 - 天下 - 博客频道 -模拟鼠标点击:1、这里是鼠标左键按下和松开两个事件的组合即一次单击:mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )2、模拟鼠标右键单击事件:mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 )3、两次连续的鼠标左键单击事件构成一次鼠标双击事件:mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )4、使用绝对坐标MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点--直接设定绝对坐标并单击mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);其中X,Y分别是你要点击的点的横坐标和纵坐标模拟键盘输入:[cpp]void EnterString(const char* text) { bool bShift = false; size_t length = strlen(text);for(size_t index = 0;index &lt; length;index++) { int val = text[index];if(val &gt;= 97 &amp;&amp; val &lt;= 122) //小写a-z {val -= 32; bShift = false; } else if(val&gt;= 65 &amp;&amp; val &lt;= 90) //大写A-Z { bShift = true;} else if(val &gt;= 48 &amp;&amp; val &lt;= 57) //数字0-9 { bShift = false; } else //特殊符号{ switch(val) { case '`':val = 192; bShift = false;break; case '~': val = 192;bShift = true; break; case '!':val = '1'; //!和1在同一个键盘,使用同一个键盘码,以下相同bShift = true; break; case '@': val = '2'; //@和2在同一个键盘,使用同一个键盘码,以下相同bShift = true; break; case '#': val = '3'; bShift = true;break; case '$': val = '4';bShift = true; break; case '%':val = '5'; bShift = true;break; case '^': val = '6';bShift = true; break; case '&amp;':val = '7'; bShift = true;break; case '*': val = '8';bShift = true; break; case '(':val = '9'; bShift = true;break; case ')': val = '0';bShift = true; break; case '-':val = 189; bShift = false;break; case '=': val = 187;bShift = false; break; case '_':val = 189; bShift = true;break; case '+': val = 187;bShift = true; break; case '[':val = 219; bShift = false;break; case '{': val = 219;bShift = true; break; case ']':val = 221; bShift = false;break; case '}': val = 221;bShift = true; break; case '\\':val = 220; bShift = false;break; case '|': val = 220;bShift = true; break; case ';':val = 186; bShift = false;break; case ':': val = 186;bShift = true; case '\'': val = 222; bShift = false; break; case'\&quot;': val = 222; bShift = true;break; case ',': val = 188;bShift = false; break; case '&lt;': val = 188; bShift = true;break; case '.': val = 190;bShift = false; break; case '&gt;':val = 190; bShift = true;break; case '/': val = 191;bShift = false; break; case '?':val = 191; bShift = true;break; default: break;} } if(bShift)keybd_event(VK_SHIFT,0,0,0); keybd_event(val,0,0,0);keybd_event(val,0,KEYEVENTF_KEYUP,0); if(bShift)keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); } }但是要注意,如果用户默认是中文输入法,那我们得先想办法切换到英文输入法才行。

c#模拟键盘鼠标事件sendkeys

c#模拟键盘鼠标事件sendkeys

C#模拟键盘鼠标事件-SendKeys2007-09-18 15:13 7689人阅读评论(1) 收藏举报1.模拟键盘事件System.Windows.Forms.SendKeys以下是SendKeys 的一些特殊键代码表。

键代码BACKSPACE {BACKSPACE}、{BS} 或{BKSP}BREAK {BREAK}CAPS LOCK {CAPSLOCK}DEL 或DELETE {DELETE} 或{DEL}DOWN ARROW(下箭头键){DOWN}END {END}ENTER {ENTER} 或~ESC {ESC}HELP {HELP}HOME {HOME}INS 或INSERT {INSERT} 或{INS}LEFT ARROW(左箭头键){LEFT}NUM LOCK {NUMLOCK}PAGE DOWN {PGDN}PAGE UP {PGUP}PRINT SCREEN {PRTSC}(保留,以备将来使用)RIGHT ARROW(右箭头键){RIGHT}SCROLL LOCK {SCROLLLOCK}TAB {TAB}UP ARROW(上箭头键){UP}F1 {F1}F2 {F2}F3 {F3}F4 {F4}F5 {F5}F6 {F6}F7 {F7}F8 {F8}F9 {F9}F10 {F10}F11 {F11}F12 {F12}F13 {F13}F14 {F14}F15 {F15}F16 {F16}数字键盘加号{ADD}数字键盘减号{SUBTRACT}数字键盘乘号{MULTIPLY}数字键盘除号{DIVIDE}若要指定与SHIFT、CTRL 和ALT 键的任意组合一起使用的键,请在这些键代码之前加上以下一个或多个代码:键代码SHIFT + (SHIFT="+")CTRL ^ (CTRL="^") 如果输入ALT % private void button1_Click(object sender, System.EventArgs e) {//英文输入this.richTextBox1.Focus();for(int i=65;i<91;i++){char Letter=(char)i;SendKeys.Send(Letter.ToString());System.Threading.Thread.Sleep(100);SendKeys.Flush();}for(int i=97;i<123;i++){char Letter=(char)i;SendKeys.Send(Letter.ToString());System.Threading.Thread.Sleep(100);SendKeys.Flush();}private void button3_Click(object sender, System.EventArgs e) {//数字输入this.richTextBox1.Focus();for(int i=0;i<10;i++){SendKeys.Send(i.ToString());System.Threading.Thread.Sleep(100);SendKeys.Flush();}}private void button4_Click(object sender, System.EventArgs e) {//Backspacethis.richTextBox1.Focus();SendKeys.Send("{Backspace}");}private void button5_Click(object sender, System.EventArgs e) {//Homethis.richTextBox1.Focus();SendKeys.Send("{Home}");}private void button6_Click(object sender, System.EventArgs e) {//Endthis.richTextBox1.Focus();SendKeys.Send("{End}");}private void button7_Click(object sender, System.EventArgs e) {//Enterthis.richTextBox1.Focus();SendKeys.Send("{Enter}");private void button8_Click(object sender, System.EventArgs e) {//Deletethis.richTextBox1.Focus();SendKeys.Send("{Delete}");}private void button2_Click(object sender, System.EventArgs e) {//Shift+Homethis.richTextBox1.Focus();SendKeys.Send("+{Home}");}private void button9_Click(object sender, System.EventArgs e) {//Shift+Endthis.richTextBox1.Focus();SendKeys.Send("+{End}");}看下方法的说明public class SendKeys : System.ObjectSystem.Windows.Forms 的成员摘要:提供将键击发送到应用程序的方法。

VC驱动模拟按键

VC驱动模拟按键

KBCWait4IBE '发送数据前应该先等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键
Private Sub Form_Load()
If InitializeWinIo = False Then
'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false
MsgBox "驱动程序加载失败!"
Unload Me
End If
Timer1.Interval=3000
KBCWait4IBE '等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键
Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean

Visualstudio之C#实现数字输入模拟键盘

Visualstudio之C#实现数字输入模拟键盘

Visualstudio之C#实现数字输⼊模拟键盘背景当前做的⼀个上位机需运⾏在⼯控机上,众所周知,⼯控机不可能配备键盘,只能是触屏,⽽我当前的上位机需要输⼊参数,于是之前的解决办法既是调⽤Windows⾃带的OSK.exe虚拟键盘,⽅法在我的另⼀外⼀篇博客中已详述,但这种做法有两个致命缺陷,⼀是由于调⽤了外部.exe程序,国产杀毒软件会将我的上位机判定为疑似病毒⽂件(⼿动微笑);⼆是,若是该虚拟键盘被提前打开,我就没办法继续打开该软键盘使其在我的上位机界⾯之上,⽽该软键盘不是由我打开,我就获取不到它的Process,也就⽆法将其关闭重新打开,⼯控机的界⾯通常不会出现任务栏,因此虚拟键盘要是没有实体键盘就永远⽆法打开,头疼⾄极。

于是就想到⾃⼰实现软键盘。

便有此⽂,做个记录。

⾸先强调⼀下,本软键盘⾮真正意义的软键盘,只是⽤了很笨的⽅法在同⼀个界⾯上提供了⼀个数字输⼊的解决⽅案,实际效果如下:正⽂为了不让按键在点击的时候获取焦点,所以我采⽤了label控件,⼀共12个控件,分别是0,1...9,退格,清除,对应的name分别为,keyb0,keyb1,```keb9,keybback,keybclear,对应的Text就是相应的0,1,2...9,退格,清除,为了调整所有按键⼤⼩,属性Autosize应该设置为false。

在窗体Load事件中,添加所有label控件的单击事件mybutton_clicked,private void lazerctrl_Load(object sender, EventArgs e){// 注册键盘按键单击事件keyb1.Click += new EventHandler(mybutton_clicked);keyb2.Click += new EventHandler(mybutton_clicked);keyb3.Click += new EventHandler(mybutton_clicked);keyb4.Click += new EventHandler(mybutton_clicked);keyb5.Click += new EventHandler(mybutton_clicked);keyb6.Click += new EventHandler(mybutton_clicked);keyb7.Click += new EventHandler(mybutton_clicked);keyb8.Click += new EventHandler(mybutton_clicked);keyb9.Click += new EventHandler(mybutton_clicked);keyb0.Click += new EventHandler(mybutton_clicked);keybback.Click += new EventHandler(mybutton_clicked);keybclear.Click += new EventHandler(mybutton_clicked);}在⿏标按键事件中,将控件代表的数字值,填⼊到页⾯上最后⼀个获取到焦点的TextBox,内。

C#模拟键盘鼠标事件-SendKeys

C#模拟键盘鼠标事件-SendKeys

C#模拟键盘鼠标事件-SendKeys2007-09-18 15:13 7689人阅读评论(1) 收藏举报1.模拟键盘事件System.Windows.Forms.SendKeys以下是SendKeys 的一些特殊键代码表。

键代码BACKSPACE {BACKSPACE}、{BS} 或{BKSP}BREAK {BREAK}CAPS LOCK {CAPSLOCK}DEL 或DELETE {DELETE} 或{DEL}DOWN ARROW(下箭头键){DOWN}END {END}ENTER {ENTER} 或~ESC {ESC}HELP {HELP}HOME {HOME}INS 或INSERT {INSERT} 或{INS}LEFT ARROW(左箭头键){LEFT}NUM LOCK {NUMLOCK}PAGE DOWN {PGDN}PAGE UP {PGUP}PRINT SCREEN {PRTSC}(保留,以备将来使用)RIGHT ARROW(右箭头键){RIGHT}SCROLL LOCK {SCROLLLOCK}TAB {TAB}UP ARROW(上箭头键){UP}F1 {F1}F2 {F2}F3 {F3}F4 {F4}F5 {F5}F6 {F6}F7 {F7}F8 {F8}F9 {F9}F10 {F10}F11 {F11}F12 {F12}F13 {F13}F14 {F14}F15 {F15}F16 {F16}数字键盘加号{ADD}数字键盘减号{SUBTRACT}数字键盘乘号{MULTIPLY}数字键盘除号{DIVIDE}若要指定与SHIFT、CTRL 和ALT 键的任意组合一起使用的键,请在这些键代码之前加上以下一个或多个代码:键代码SHIFT + (SHIFT="+")CTRL ^ (CTRL="^") 如果输入ALT % private void button1_Click(object sender, System.EventArgs e) {//英文输入this.richTextBox1.Focus();for(int i=65;i<91;i++){char Letter=(char)i;SendKeys.Send(Letter.ToString());System.Threading.Thread.Sleep(100);SendKeys.Flush();}for(int i=97;i<123;i++){char Letter=(char)i;SendKeys.Send(Letter.ToString());System.Threading.Thread.Sleep(100);SendKeys.Flush();}private void button3_Click(object sender, System.EventArgs e) {//数字输入this.richTextBox1.Focus();for(int i=0;i<10;i++){SendKeys.Send(i.ToString());System.Threading.Thread.Sleep(100);SendKeys.Flush();}}private void button4_Click(object sender, System.EventArgs e) {//Backspacethis.richTextBox1.Focus();SendKeys.Send("{Backspace}");}private void button5_Click(object sender, System.EventArgs e) {//Homethis.richTextBox1.Focus();SendKeys.Send("{Home}");}private void button6_Click(object sender, System.EventArgs e) {//Endthis.richTextBox1.Focus();SendKeys.Send("{End}");}private void button7_Click(object sender, System.EventArgs e) {//Enterthis.richTextBox1.Focus();SendKeys.Send("{Enter}");private void button8_Click(object sender, System.EventArgs e) {//Deletethis.richTextBox1.Focus();SendKeys.Send("{Delete}");}private void button2_Click(object sender, System.EventArgs e) {//Shift+Homethis.richTextBox1.Focus();SendKeys.Send("+{Home}");}private void button9_Click(object sender, System.EventArgs e) {//Shift+Endthis.richTextBox1.Focus();SendKeys.Send("+{End}");}看下方法的说明public class SendKeys : System.ObjectSystem.Windows.Forms 的成员摘要:提供将键击发送到应用程序的方法。

VC++键盘与鼠标的消息处理(2)

VC++键盘与鼠标的消息处理(2)

教案2007 ~2008 学年第一学期主讲教师课程名称面向对象程序设计(VC++)课程类别专业基础课学时及学分80、4授课班级使用教材VC++的使用及面向对象软件工程实例分析系(院、部)教研室(实验室) 计算机应用教研室课时授课计划课次序号:一、课题:ch7 键盘与鼠标的消息处理(2)二、课型:讲授三、目的要求:1、熟悉键盘消息及常见的虚拟键码。

2、掌握键盘消息的处理方法。

四、重点、难点:重点:键盘消息处理技术。

难点:按键消息(WM_KEYDOWN)的处理技巧。

五、教学方法及手段:案例式教学:设计目标、关键技术、结合实例讲解语法、总结。

按照提出问题、解决问题的思路开展教学。

六、参考资料:《VC++的使用及面向对象软件工程实例分析》贺怀清编,电子工业出版社《C++面向对象程序设计》李涛编,高等教育出版社,第8章七、作业:实验题1,3八、授课记录:九、授课效果分析:十、教学进程(教学内容、教学环节及时间分配等)1、复习鼠标的消息处理:关键是确定使用哪个消息、如何编写消息处理函数。

2、导入课题利用键盘消息获取用户的输入信息,在消息处理函数中完成用户的功能需求。

3、教学内容一、键盘消息键盘消息分类:系统键消息和非系统键消息系统键:输入键与Alt键组合,一般有Windows内部处理。

非系统键:不与Alt键组合的输入键。

键盘消息:系统键消息:WM_SYSKEYDOWN WM_SYSKEYUP非系统键消息:WM_KEYDOWN WM_KEYUP WM_CHAR(可见字符的按键消息)说明:Windows总是把键盘消息发送给拥有输入焦点的窗口。

可以使用CWnd::SetFocus()函数设置某个窗口拥有输入焦点,用GetFocus()获取拥有输入焦点的窗口。

二、键盘消息的处理即键盘消息处理函数,所有键盘消息处理函数的参数相同,比如:void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)nChar表示被击键的字符,nRepCnt表示该键被击的重复次数,nFlags中包含键的扫描码和标志位。

c#SendInput模拟输入字符和按键

c#SendInput模拟输入字符和按键

c#SendInput模拟输⼊字符和按键介绍: 该程序本意是为了在彩六⾥打中⽂⽤的,现整理出来供⼤家复制粘贴。

(源程序以开源⾄) 主要使⽤SendInput函数,与c语⾔中⽤法⼀致。

(部分代码来⾃⽹络)命名空间部分using static System.Threading.Thread;using System.Runtime.InteropServices;结构体和函数声明部分[StructLayout(LayoutKind.Explicit)]public struct INPUT{[FieldOffset(0)]public int type;[FieldOffset(4)]public KEYBDINPUT ki;[FieldOffset(4)]public MOUSEINPUT mi;[FieldOffset(4)]public HARDWAREINPUT hi;}public struct MOUSEINPUT{public int dx;public int dy;public int mouseData;public int dwFlags;public int time;public IntPtr dwExtraInfo;}public struct KEYBDINPUT{public short wVk;public short wScan;public int dwFlags;public int time;public IntPtr dwExtraInfo;}public struct HARDWAREINPUT{public int uMsg;public short wParamL;public short wParamH;}[DllImport("user32")]public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);⾃定义函数封装部分public void SimulateInputString(char c){INPUT[] input = new INPUT[2];input[0].type = 1;input[0].ki.wVk = 0;//dwFlags 为KEYEVENTF_UNICODE 即4时,wVk必须为0input[0].ki.wScan = (short)c;input[0].ki.dwFlags = 4;//输⼊UNICODE字符input[0].ki.time = 0;input[0].ki.dwExtraInfo = IntPtr.Zero;input[1].type = 1;input[1].ki.wVk = 0;input[1].ki.wScan = (short)c;input[1].ki.dwFlags = 6;input[1].ki.time = 0;input[1].ki.dwExtraInfo = IntPtr.Zero;SendInput(2u, input, Marshal.SizeOf((object)default(INPUT)));}public void SimulateInputKey(int key){INPUT[] input = new INPUT[1];input[0].type = 1;//模拟键盘input[0].ki.wVk = (short)key;input[0].ki.dwFlags = 0;//按下SendInput(1u, input, Marshal.SizeOf((object)default(INPUT))); Sleep(50);input[0].type = 1;//模拟键盘input[0].ki.wVk = (short)key;input[0].ki.dwFlags = 2;//抬起SendInput(1u, input, Marshal.SizeOf((object)default(INPUT))); Sleep(50);}说明:SimulateInputString为发送单个字符⽂本;SimulateInputKey为模拟按键按下和抬起,参数key为虚拟键码;关于键码的列表,可以查看微软⽂档:。

VB模拟鼠标键盘动作(转)

VB模拟鼠标键盘动作(转)

VB模拟鼠标键盘动作(转)2011-03-31 15:16来自网址:/share/detail/16221474VB模拟鼠标键盘动作有些时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。

那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。

当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。

如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。

当你按下一个键时,这个键的扫描码就被传给系统。

扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。

键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。

键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。

什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。

无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。

简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。

当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。

然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。

最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。

这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。

驱动级键盘模拟(C#)(高手请飘过)

驱动级键盘模拟(C#)(高手请飘过)

驱动级键盘模拟(C#)(⾼⼿请飘过)游戏外挂⼀般分为三个级别:初级是⿏标、键盘模拟,中级是Call游戏内部函数,读写内存,⾼级是抓包,封包的“脱机挂”(完全模拟客户端⽹络数据,不⽤运⾏游戏)。

⽤C#写外挂的不是很多,⼤部分是C++,主要原因是MS的C#⽬前不⽀持内联汇编功能。

因此⽤C++写底层库,然后⽤C#调⽤成为DONET爱好者开发外挂的⾸选。

对于⿏标键盘模拟的外挂⽽⾔,很多⼈认为没有什么技术含量,因为⽆⾮就是SendMessage或者Key_event,再⾼级点就是Hook进⼊程序内部操作。

我也曾⽤这种技术开发过⼀些游戏辅助程序。

但最近我在研究XNA的时候遇到了⼀点⿇烦,这种屡试不爽⽅法居然失效了。

游戏对于消息命令⼀点也不“服从”,我们有这样的疑问:它是如何识别真实键盘的按键的呢?难道是程序中有判断吗?如果抛开上⾯的疑问,换另外⼀个⾓度思考。

在DOS时代,还记得那个经典的去除BIOS密码的Debug命令吗?其原理就是利⽤了BIOS 中断,其实对于键盘按键,不管Windows怎样封装,到最后都会调⽤BIOS中断来识别按键。

然⽽消息发送毕竟是Windows系统的玩意⼉,不管在Windows层⾯上怎样判断,我们只要让BIOS下⼀道“圣旨”,看哪个游戏还敢如此嚣张在解释更详细的原理之前,我们先来抓出幕后⿊⼿,看看是哪个给游戏撑腰?让它有胆⼦违抗Windows消息命令。

究竟是判断了真实键盘信息,还是有其他原因。

结果在DirectX编程中发现了DirectInput这个API。

就是它绕过了Windows的消息机制,它的⽬的是为了让游戏的实时性控制更好、更快。

Windows消息是队列形式的,在传递过程中会有延时,⽐如格⽃类游戏对实时性控制要求是⾮常⾼的,Window消息机制不能满⾜这个需求。

⽽DirectInput直接和键盘驱动程序打交道,效率当然要⾼出⼀⼤截。

我认为⼤部分游戏不响应消息的真正的原因在这⾥,⽽不是故意写了反作弊系统。

c#模拟鼠标键盘操作

c#模拟鼠标键盘操作

c#模拟⿏标键盘操作 c#模拟⿏标键盘操作收藏⼀个简单的模拟键盘⿏标操作的类,扩充 VirtualKeys 枚举就可以了,或者直接写!using System;using System.Runtime.InteropServices;using System.Text;class Keyboard{const uint KEYEVENTF_EXTENDEDKEY = 0x1;const uint KEYEVENTF_KEYUP = 0x2;[DllImport("user32.dll")]static extern short GetKeyState(int nVirtKey);[DllImport("user32.dll")]static extern void keybd_event(byte bVk,byte bScan,uint dwFlags,uint dwExtraInfo);public enum VirtualKeys: byte{VK_NUMLOCK = 0x90, //数字锁定键VK_SCROLL = 0x91, //滚动锁定VK_CAPITAL = 0x14, //⼤⼩写锁定VK_A = 62}public static bool GetState(VirtualKeys Key){return (GetKeyState((int)Key)==1);}public static void SetState(VirtualKeys Key, bool State){if(State!=GetState(Key)){keybd_event((byte)Key,0x45,KEYEVENTF_EXTENDEDKEY | 0,);keybd_event((byte)Key,0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,);}}}⽰例:模拟操作Keyboard.SetState(VirtualKeys.VK_CAPITAL,!Keyboard.GetState(VirtualKeys.VK_CAPITAL));得到键盘状态Keyboard.GetState(VirtualKeys.VK_CAPITAL)* ⼗进制值标识符 IBM兼容键盘 --------------------------------------------------------------------------------1 VK_LBUTTON ⿏标左键2 VK_RBUTTON ⿏标右键3 VK_CANCEL Ctrl+Break(通常不需要处理)4 VK_MBUTTON ⿏标中键8 VK_BACK Backspace9 VK_TAB Tab12 VK_CLEAR Num Lock关闭时的数字键盘513 VK_RETURN Enter(或者另⼀个)16 VK_SHIFT Shift(或者另⼀个)17 VK_CONTROL Ctrl(或者另⼀个)18 VK_MENU Alt(或者另⼀个)19 VK_PAUSE Pause20 VK_CAPITAL Caps Lock27 VK_ESCAPE Esc32 VK_SPACE Spacebar33 VK_PRIOR Page Up34 VK_NEXT Page Down35 VK_END End36 VK_HOME Home37 VK_LEFT 左箭头38 VK_UP 上箭头39 VK_RIGHT 右箭头40 VK_DOWN 下箭头41 VK_SELECT 可选42 VK_PRINT 可选43 VK_EXECUTE 可选44 VK_SNAPSHOT Print Screen45 VK_INSERT Insert46 VK_DELETE Delete47 VK_HELP 可选48~57 ⽆ 主键盘上的0~965~90 ⽆ A~Z96~105 VK_NUMPAD0~VK_NUMPAD9 Num Lock打开时数字键盘上的0~9106 VK_NULTIPLY 数字键盘上的*107 VK_ADD 数字键盘上的+108 VK_SEPARATOR 可选109 VK_SUBTRACT 数字键盘上的-110 VK_DECIMAL 数字键盘上的.111 VK_DIVIDE 数字键盘上的/112~135 VK_F1~VK_F24 功能键F1~F24144 VK_NUMLOCK Num Lock145 VK_SCROLL Scroll Lock*/突然发现在c#⾥⾯原来还有⼀个 System.Windows.Forms.SendKeys不过这个只能模拟键盘真正能模拟⿏标操作的代码在这⾥!找的我好⾟苦啊!函数声明:private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;private readonly int MOUSEEVENTF_LEFTUP = 0x4;[DllImport("user32")]public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);调⽤⽅法:mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);其中X,Y分别是你要点击的点的横坐标和纵坐标。

模拟键盘输入

模拟键盘输入

模拟键盘输入Dim wshShellSet wshShell = CreateObject("Wscript.Shell")WshShell.SendKeys "{DOWN}"留着,以后也许有用。

vbs经典回顾之[键盘输入方法]wshShell.SendKeys[键盘输入方法]wshShell.SendKeys 方法探析(2010-09-30 14:35:11)模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行,其使用格式为:object.SendKeys(string)“object”:表示WshShell对象“string”:表示要发送的按键指令字符串,需要放在英文双引号中。

Dim wshShellSet wshShell = CreateObject("Wscript.Shell")wshShell.SendKeys "{ENTER}" '模拟键盘操作回车-----------------------------------1.基本键一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshS hell.SendKeys "x"”即可。

当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“WshShell.SendKeys "happy"”。

2.特殊功能键对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示:Shift---------WshShell.SendKeys "+"Ctrl---------WshShell.SendKeys "^"Alt---------WshShell.SendKeys "%" (注意:这样使用时,不用大括号括起这些特殊字符。

Windows下C++模拟键盘输入,鼠标点击,鼠标移动,获取句柄

Windows下C++模拟键盘输入,鼠标点击,鼠标移动,获取句柄

Windows下C++模拟键盘输入,鼠标点击,鼠标移动,获取
句柄
展开全文
在Windows下完成这些功能需要用到VC
模拟键盘输入:
VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo); //包含windows.h
鼠标按键事件:
备注:模拟鼠标单击
mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_L EFTUP,0,0,0,0);
鼠标移动事件:
获取其它程序句柄:
备注:
HWND id=FindWindow(NULL,"微信");//类名(第一个参数)可以为空,第二个参数为需要获取那个程序的句柄的程序名,打开任务管理器可以看到。

获取微信的句柄
QT中在FindWindow中直接填入程序名字符串(第二个参数),可能会报错或者无法正确获取程序句柄;
解决方案:需要将程序名字符串转为 LPCWSTR 再填入
如:
QString appNameStr("微信");
QString classNameStr("WeChatMainWndForPC");
LPCWSTR appName = reinterpret_cast<LPCWSTR>(appNameStr.data());
LPCWSTR className= reinterpret_cast<LPCWSTR>(classNameStr.data());。

VC编程实现控制其他应用程序

VC编程实现控制其他应用程序

VC编程实现控制其他应用程序VC编程可以实现控制其他应用程序的功能,可以通过编写代码来实现对其他应用程序的自动化操作、窗口控制、数据交互等。

下面将介绍VC编程实现控制其他应用程序的一般步骤和方法。

首先,要控制其他应用程序,首先需要了解被控制应用程序的接口和功能。

可以使用Windows API、COM等方式获取被控制应用程序的相关信息,并定义好需要使用的函数和数据类型。

在VC编程中,可以使用MFC (Microsoft Foundation Class)库、Windows API等来实现对应的功能。

一般而言,控制其他应用程序的主要方法有以下几种:1. Shell执行:VC编程可以使用Shell命令来执行其他应用程序的命令行操作。

可以使用ShellExecute函数来调用其他应用程序并传递相关参数。

例如,可以使用ShellExecute(NULL, "open", "notepad.exe", "myfile.txt", NULL, SW_SHOW)来打开记事本,并打开指定的文件。

2. 窗口控制:控制其他应用程序的窗口可以使用Windows API函数,如FindWindow、GetWindow、SetWindowPos等函数来实现。

可以通过FindWindow函数来通过窗口标题或类名找到其他应用程序的窗口句柄,然后使用GetWindow函数获取窗口的信息,并通过SetWindowPos函数来调整窗口的位置、大小等。

3. 模拟按键和鼠标操作:VC编程可以使用Windows API函数来模拟按键和鼠标操作。

例如,可以使用keybd_event函数来模拟键盘按键操作,使用mouse_event函数来模拟鼠标点击和移动操作。

通过这些函数,可以实现在其他应用程序中输入文本、点击按钮等操作。

4. 进程控制:VC编程可以通过Windows API函数来控制其他应用程序的进程。

用应用程序模拟键盘和鼠标按键(Keyboard and mouse buttons are simulated with Applications)

用应用程序模拟键盘和鼠标按键(Keyboard and mouse buttons are simulated with Applications)

用应用程序模拟键盘和鼠标按键(Keyboard and mouse buttons aresimulated with Applications)Today, with the popularity of Windows, the windows interface program is welcomed by the majority of users. There are no more than two operations for these programs, keyboard input control and mouse input control. Sometimes, for complex or repetitive input operations, can we instead of manual input by programming instead of using a program to simulate keyboard and mouse input? The answer is yes. Here mainly through the two Windows API function to achieve. Here's an example of VC++ to show you how to implement these two functions.Analog keyboard, we use the Keybd_event API function, simulate the mouse button, using the mouse_event function. Calling the API function in VC is simple and convenient.First, let's introduce the Keybd_event function. Keybd_event can trigger a key event, that is to say, to generate a WM_KEYDOWN or WM_KEYUP message. Of course, you can also use these two messages to simulate keystrokes, but not directly with this function. Keybd_event has four parameters, the first is the virtual key value for the key, such as the Enter key vk_return and the tab key vk_tab. The second parameter is the scan code, generally not set, with 0 instead of line parameters for the third option sign, if Keydown is set to 0, if Keyup is set to "KEYEVENTF_KEYUP", the fourth parameter is generally set to 0. The following code can be used to simulate the press key, where the XX represents the virtual key value of the XX key, and here is the key code for each key, such as''A''=65Keybd_event (65,0,0,0);Keybd_event (65,0, KEYEVENTF_KEYUP, 0);...The best mouse_event with SetCursorPos (x, y) function used, similar to Keybd_event, mouse_event has five parameters, the first option to sign, MOUSEEVENTF_LEFTDOWN said the left click on the MOUSEEVENTF_LEFTUP button to release said, the system sends the corresponding message. The two or three arguments represent x, y, respectivelyThe relative position is generally set to 0,0, and the four or five parameter is not important, and can be generally set to 0,0. To get more detailed usage of the Keybd_event and mouse_event functions, refer to MSDN or Delphi help.The following is an example code for mouse_event:POINT lpPoint;GetCursorPos (&lpPoint);SetCursorPos (lpPoint.x, lpPoint.y);Mouse_event (MOUSEEVENTF_LEFTDOWN, 0,0,0,0);Mouse_event (MOUSEEVENTF_LEFTUP, 0,0,0,0);The above code indicates double clicking of the mouse. To indicate a click, you can use two mouse_event (once down and one release).Note, whether it is keyboard or mouse events, should pay attention to restore, that is, press the button to be released, a Keydown corresponds to a Keyup; click the mouse should be released, or it may affect the function of the program.Well, I hope this article will let you have a preliminary understanding of the keyboard and mouse buttons. If you want to know more about it, you can consult the MSDN online help, and do a lot of hands-on work. It may be of great help to youNew:/leon_founder/archive/2006/08/28/113265 0.aspxWith VC analog buttons, the first thing I think of is, of course, SendMessage, which uses messages to send a windowSendMessage (WM_KEYDOWN, 'a', 0L);This button is really enough to simulate normal buttons, but when you simulate the function buttons, such as num, lock, and print screen, problems arise, and the simulation failsThis time we need to use the keybd_event function, this function is not to send messages to simulate the keyboard, and is directly simulated keyboard practiceUse caseKeybd_event (VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);Used to simulate print screen buttonsThus fundamentally solves the problem that those special function keys can not be simulated by SendMessage or PostMessageUsing applications to simulate keyboard and mouse buttons, /document/viewdoc/, id=255Author: Owen.GuoList of commonly used key values:Key codeConstant value descriptionVbkeylbutton 1 left mouse buttonVbkeyrbutton 2 right mouse buttonVbkeycancel 3 cancel keyVbkeymbutton 4 middle mouse buttonvbkeyback 8退键vbkeytab 9标签键vbkeyclear 12明确键vbkeyreturn 13进入键vbkeyshift 16班键vbkeycontrol 17 Ctrl键18菜单键vbkeymenu19键vbkeypause停顿vbkeycapital 20大写锁定键27键vbkeyescape ESC32键vbkeyspace空格键33键vbkeypageup PageUp vbkeypagedown键34下一页vbkeyend 35端键vbkeyhome 36家键vbkeyleft 37左箭头键vbkeyup 38箭键vbkeyright 39右箭头键vbkeydown 40向下箭头键vbkeyselect 41选择键vbkeyprint 42打印屏幕键vbkeyexecute 43执行键vbkeysnapshot 44拍摄键vbkeyinser 45英寸键vbkeydelete 46德尔键vbkeyhelp 47帮助键144 vbkeynumlock Num Lock键一个键到Z键与其ASCII码的相应值'a'到Z是一致的常数值描述65个键vbkeyavbkeyb 66 B键vbkeyc 67 C键vbkeyd 68 d键vbkeye 69 E键vbkeyf 70 F键vbkeyg 71克键vbkeyh 72 h键73我键vbkeyi74键vbkeyj [J]. vbkeyk 75 K键vbkeyl 76 L键vbkeym 77米键vbkeyn 78 N键vbkeyo 79 O键vbkeyp 80 P键vbkeyq 81问键vbkeyr 82 R键vbkeys 83键vbkeyt 84 T键vbkeyu 85 U键vbkeyv 86 V键vbkeyw 87 W键vbkeyx 88 x键vbkeyy 89 Y键vbkeyz 90 Z键0键到9键与其ASCII码的相应值“0”“9”是一致的到常数值描述48 0键vbkey049 1键vbkey150 2键vbkey251 3键vbkey352 4键vbkey453 5键vbkey554 6键vbkey655 7键vbkey756 8键vbkey857 9键vbkey9数字小键盘上的键常数值描述96 0键vbkeynumpad097 1键vbkeynumpad198 2键vbkeynumpad299 3键vbkeynumpad3100 4键vbkeynumpad4101 5键vbkeynumpad5102 6键vbkeynumpad6103 7键vbkeynumpad7104 8键vbkeynumpad8105 9键vbkeynumpad9 vbkeymultiply 106乘号(*)键vbkeyadd 107加号(+)键vbkeyseparator 108进入键(在数字小键盘上)vbkeysubtract 109减号(-)键vbkeydecimal 110小数点键(。

vc模拟键盘鼠标命令

vc模拟键盘鼠标命令

vc模拟鼠标键盘操作实用类//****************** 类mk头文件mk.h **************************#if !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_)#define AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "winable.h"class mk{public:mk();static void Key(BYTE k, int mSeconds=0);//按一个键,mSeconds表按键后到//下一次操作延迟的时间:msstatic void Key2(BYTE k1, BYTE k2,int mSeconds=0);//按2个键static void Key3(BYTE k1,BYTE k2,BYTE k3,int mSeconds=0);//按3个键static void Click(int x,int y,int mSeconds=0);//单击static void RClick(int x,int y,int mSeconds=0);//右击static void DClick(int x,int y,int mSeconds=0);//双击static void CtrlClick(int x, int y, int mSeconds=0);//Ctrl+单击static void Drag(int x1,int y1,int x2,int y2,int mSeconds=0);//鼠标拖动virtual ~mk();};#endif// !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_) //****************** 类mk头文件mk.h end**************************//****************** 类mk实现文件mk.cpp **************************#include "stdafx.h"#include "mk.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////mk::mk(){}mk::~mk(){}void mk::Click(int x, int y, int mSeconds){SetCursorPos(x,y);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);Sleep(mSeconds);}void mk::DClick(int x, int y, int mSeconds){SetCursorPos(x,y);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); Sleep(mSeconds);}void mk::Drag(int x1, int y1, int x2, int y2, int mSeconds) {SetCursorPos(x1,y1);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); SetCursorPos(x2,y2);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); Sleep(mSeconds);}void mk::RClick(int x, int y, int mSeconds){SetCursorPos(x,y);mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0); Sleep(mSeconds);}void mk::Key(BYTE k, int mSeconds){keybd_event(k,0,0,0);keybd_event(k,0,KEYEVENTF_KEYUP,0);Sleep(mSeconds);}void mk::Key2(BYTE k1, BYTE k2, int mSeconds){//法1//keybd_event(k1, 0, 0 ,0);//keybd_event(k2, 0, 0 ,0);//keybd_event(k2, 0, KEYEVENTF_KEYUP,0);//keybd_event(k1, 0, KEYEVENTF_KEYUP,0);//法2,更通用,但须先#include "winable.h"INPUT input[4];memset(input,0,sizeof(input));input[0].type=input[1].type=input[2].type=input[3].type=INPUT_KEYBOARD;input[0].ki.wVk=input[3].ki.wVk=k1;input[1].ki.wVk=input[2].ki.wVk=k2;input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(4, input, sizeof(INPUT));Sleep(mSeconds);}void mk::CtrlClick(int x, int y, int mSeconds){SetCursorPos(x,y);keybd_event(VK_CONTROL ,0,0,0);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);Sleep(mSeconds);}void mk::Key3(BYTE k1, BYTE k2, BYTE k3, int mSeconds){if(k1==VK_CONTROL&&k2==VK_MENU&&k3==VK_DELETE)ShellExecute(NULL,NULL,"taskmgr.exe",NULL,NULL,SW_SHOW);else{INPUT input[6];memset(input,0,sizeof(input));input[0].type=input[1].type=input[2].type=input[3].type=input[4].type=input[5].type=INPUT_KE YBOARD;input[0].ki.wVk=input[5].ki.wVk=k1;input[1].ki.wVk=input[4].ki.wVk=k2;input[2].ki.wVk=input[3].ki.wVk=k3;input[3].ki.dwFlags=input[4].ki.dwFlags=input[5].ki.dwFlags=KEYEVENTF_KEYUP;SendInput(6, input, sizeof(INPUT));}Sleep(mSeconds);}//****************** 类mk实现文件mk.cpp end**************************===================================================================VC模拟键盘操作INPUT input[4];memset(input, 0, sizeof(input));//设置模拟键盘输入input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;input[0].ki.wVk = input[2].ki.wVk = VK_CONTROL;input[1].ki.wVk = input[3].ki.wVk = VK_ESCAPE;// 释放按键input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;SendInput(4, input, sizeof(INPUT));******************************************************************************* **符号常量十六进制值指定的鼠标或键盘按键VK_LBUTTON 01 鼠标左键VK_RBUTTON 02 鼠标右键VK_CANCEL 03 Control-break 过程VK_MBUTTON 04 鼠标中键VK_BACK 08 BACKSPACE 键VK_TAB 09 TAB 键VK_CLEAR 0C CLEAR 键VK_RETURN 0D ENTER 键VK_SHIFT 10 SHIFT 键VK_CONTROL 11 CTRL 键VK_MENU 12 ALT 键VK_PAUSE 13 PAUSE 键VK_CAPITAL 14 CAPS LOCK 键VK_ESCAPE 1B ESC 键VK_SPACE 20 SPACEBARVK_PRIOR 21 PAGE UP 键VK_NEXT 22 PAGE DOWN 键VK_END 23 END 键VK_HOME 24 HOME 键VK_LEFT 25 LEFT ARROW 键VK_UP 26 UP ARROW 键VK_RIGHT 27 RIGHT ARROW 键VK_DOWN 28 DOWN ARROW 键VK_SELECT 29 SELECT 键VK_EXECUTE 2B EXECUTE 键VK_SNAPSHOT 2C PRINT SCREEN键(用于Windows 3.0及以后版本)VK_INSERT 2D INS 键VK_DELETE 2E DEL 键VK_HELP 2F HELP 键///////////////////////////////////////////////////对于字母键和非小键盘上的数字键,直接在单引号中加入该键就行.比如:a键:'A'1键:'1'//////////////////////////////////////////////VK_LWIN 5B Left Windows 键(Microsoft自然键盘)VK_RWIN 5C Right Windows 键(Microsoft自然键盘)VK_APPS 5D Applications 键(Microsoft自然键盘)VK_NUMPAD0 60 数字小键盘上的0 键VK_NUMPAD1 61 数字小键盘上的 1 键VK_NUMPAD2 62 数字小键盘上的 2 键VK_NUMPAD3 63 数字小键盘上的 3 键VK_NUMPAD4 64 数字小键盘上的 4 键VK_NUMPAD5 65 数字小键盘上的5 键VK_NUMPAD6 66 数字小键盘上的 6 键VK_NUMPAD7 67 数字小键盘上的7 键VK_NUMPAD8 68 数字小键盘上的8 键VK_NUMPAD9 69 数字小键盘上的9 键VK_MULTIPL Y 6A Multiply 键VK_ADD 6B Add 键VK_SEPARATOR 6C Separator 键VK_SUBTRACT 6D Subtract 键VK_DECIMAL 6E Decimal 键VK_DIVIDE 6F Divide 键VK_F1 70 F1 键VK_F2 71 F2 键VK_F3 72 F3 键VK_F4 73 F4 键VK_F5 74 F5 键VK_F6 75 F6 键VK_F7 76 F7 键VK_F8 77 F8 键VK_F9 78 F9 键VK_F10 79 F10 键VK_F11 7A F11 键VK_F12 7B F12 键VK_F13 7C F13 键VK_F14 7D F14 键VK_F15 7E F15 键VK_F16 7F F16 键VK_F17 80H F17 键VK_F18 81H F18 键VK_F19 82H F19 键VK_F20 83H F20 键VK_F21 84H F21 键VK_F22 85H F22 键VK_F23 86H F23 键VK_F24 87H F24 键VK_NUMLOCK 90 NUM LOCK 键VK_SCROLL 91 SCROLL LOCK 键VK_ATTN F6 Attn 键VK_CRSEL F7 CrSel 键VK_EXSEL F8 ExSel 键VK_EREOF F9 Erase EOF 键VK_PLAY FA Play 键VK_ZOOM FB Zoom 键VK_OEM_CLEAR FE Clear 键举例:(一)响应单独的按键:先添加PreTranslateMessage()(响应WM_CHAR)也是同样的效果,因为本例只捕捉键盘) BOOL CMydilog::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif (pMsg->message == WM_KEYDOWN){if(pMsg->wParam=='M')//直接用上面的虚码代替就可以响应所指键MessageBox("hello");//如果按下M键弹出消息.比如想当按下小键盘1时//弹出就用VK_NUMPAD1代替'M'}return CDialog::PreTranslateMessage(pMsg);}(二)组合键的用法:(本例响应Ctrl+X键)BOOL CMydilog::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif (pMsg->message == WM_KEYDOWN){switch (pMsg->wParam){case VK_ESCAPE:SetFocus ();return TRUE;case 'X':if(::GetKeyState(VK_CONTROL) < 0)//如果是Shift+X这里就//改成VK_SHIFTMessageBox("hello");return TRUE;}}return CDialog::PreTranslateMessage(pMsg); }。

C#模拟鼠标键盘控制其他窗口

C#模拟鼠标键盘控制其他窗口
首先,引入如下三个API接口:
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
SendMessage(htextbox, WM_SETTEXT, IntPtr.Zero, name);//填写文本框。
SendMessage(hbutton, WM_LBUTTONDOWN, IntPtr.Zero, null);//鼠标按下按钮。
OK,介绍完毕,收工。
SendMessage(hbutton, WM_LBUTTONUP, IntPtr.Zero, null);
这三句是获得了窗口的一个button,然后发送按下,弹起消息给它,模拟了点击鼠标的动作。
SendMessage函数的第一个参数是窗口句柄,或者窗口中控件的句柄,第二个参数是消息的类型Flag,这些值是在API的一些头文件中定义好的。你要是在C#中用,就自己去定义他们,比如
IntPtr htextbox = FindWindowEx(hwnd, IntPtr.Zero, "EDIT", null);
IntPtr htextbox2 = FindWindowEx(hwnd, htextbox, "EDIT", null);//填上次获得的句柄,可以得到下一个的句柄。
第一个与第三个是用于查找窗口句柄的,凡运行于Windows上的窗口,都具有句柄。窗口上的文本框,按钮之类的,也有其句柄(可看作子窗口句柄)。这些句柄的类型可以通过Spy++进行查询。比如C语言编写的程序中,文本框的句柄类型一般为“EDIT”,C#写的程序则不是,可以具体去查。第二个接口则是用于向窗口发送各种消息,比如向文本框发送字符串,或者向按钮发送按下与弹起的消息等。详细解释如下:

C语言人机交互键盘输入和鼠标事件处理

C语言人机交互键盘输入和鼠标事件处理

C语言人机交互键盘输入和鼠标事件处理C语言人机交互:键盘输入和鼠标事件处理C语言是一种广泛应用的编程语言,它可以与用户进行人机交互。

通过键盘输入和鼠标事件处理,我们可以实现用户与计算机之间的有效沟通和交流。

本文将详细介绍C语言中的人机交互方法,包括键盘输入的处理和鼠标事件的处理。

一、键盘输入的处理1. 单个字符的输入在C语言中,我们可以使用`getchar()`来获取用户输入的单个字符。

它会等待用户输入,并返回输入的字符。

下面是一个简单的例子:```c#include <stdio.h>int main() {char c;printf("请输入一个字符:");c = getchar();printf("您输入的字符是:%c\n", c);return 0;}```2. 字符串的输入如果需要获取用户输入的字符串,可以使用`gets()`函数。

该函数可以获取用户输入的一行字符串,并存储在指定的字符数组中。

下面是一个示例:```c#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");gets(str);printf("您输入的字符串是:%s\n", str);return 0;}```需要注意的是,`gets()`函数存在安全性问题,建议使用`fgets()`函数来代替。

`fgets()`函数可以指定缓冲区的大小,避免溢出。

二、鼠标事件的处理在C语言中,基于控制台的鼠标事件处理相对复杂。

我们可以使用Windows API来实现控制台窗口中的鼠标事件响应。

下面是一个示例,演示了如何处理鼠标的移动和点击事件:```c#include <stdio.h>#include <windows.h>void MouseEventProc(MOUSE_EVENT_RECORD mer) {DWORD dwEventFlags = mer.dwEventFlags;COORD mousePos = mer.dwMousePosition;if (dwEventFlags == MOUSE_MOVED) {printf("鼠标移动到坐标:%d, %d\n", mousePos.X, mousePos.Y);} else if (dwEventFlags == DOUBLE_CLICK) {printf("鼠标双击坐标:%d, %d\n", mousePos.X, mousePos.Y);} else if (dwEventFlags == MOUSE_WHEELED) {// 处理鼠标滚轮事件} // 其他事件处理...}int main() {HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);DWORD prevMode;INPUT_RECORD inputRecord;DWORD numEventsRead;SetConsoleMode(hInput, ENABLE_WINDOW_INPUT |ENABLE_MOUSE_INPUT); // 启用鼠标事件while (1) {ReadConsoleInput(hInput, &inputRecord, 1, &numEventsRead);if (inputRecord.EventType == MOUSE_EVENT) {MouseEventProc(inputRecord.Event.MouseEvent);}}return 0;}```在这个示例中,我们使用了`GetStdHandle()`函数获取标准输入句柄,并使用`SetConsoleMode()`函数启用了控制台窗口中的鼠标事件输入。

CC++使用keybd_event模拟键盘按键

CC++使用keybd_event模拟键盘按键

CC++使⽤keybd_event模拟键盘按键1 #include <stdio.h>2 #include <Windows.h>34/*5设置键盘⼤⼩写状态6 big:为TRUE则切换⼤写状态,否则切换⼩写状态7*/8 VOID MySetKeyBig(BOOL big = FALSE);910/*11模拟键盘按键,⽀持⼤⼩写12 str:需要按出的字符串13*/14 VOID MyAnalogKey(char *str);1516int main(void)17 {18// 当程序运⾏1.5s时再执⾏模拟按键,以便选择需要操作的窗⼝19 Sleep(1500);20 MyAnalogKey("Love life,Love BiaoGe.0123456789");21 system("pause");22return0;23 }2425 VOID MySetKeyBig(BOOL big)26 {27// 判断键盘CapsLock键是否开启状态,开启状态则为⼤写,否则为⼩写28if (GetKeyState(VK_CAPITAL))29 {30// 如果当前键盘状态为⼤写,要求改⼩写,则模拟按键CapsLock切换状态31if (!big)32 {33 keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);34 keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);35 }36 }37else38 {39// 如果当前键盘状态为⼩写,要求改⼤写,则模拟按键CapsLock切换状态40if (big)41 {42 keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);43 keybd_event(VK_CAPITAL, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);44 }45 }46 }4748 VOID MyAnalogKey(char *str)49 {50int iLen = 0;51char *tmp = NULL;52 INPUT *keys = NULL;53 BOOL bOldState = FALSE;5455// 保存此操作前的键盘状态56 bOldState = (BOOL)GetKeyState(VK_CAPITAL);57 iLen = lstrlen(str);58 tmp = (char *)malloc(iLen);59 memmove(tmp, str, iLen);60for (int i = 0; i < iLen; i++)61 {62// 某些符号⾮直属键盘按键,这⾥只过滤转换两个,以后⽤到其它字符⾃⾏添加过滤63if (tmp[i] == '')64 {65// 产⽣⼀个击键消息步骤:按下->抬起66 keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);67 keybd_event(VK_SPACE, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);68 }69else if (tmp[i] == ',')70 {71 keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);72 keybd_event(VK_OEM_COMMA, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);73 }74else if (tmp[i] >= 'a' && tmp[i] <= 'z')75 { // 根据字符⼤⼩写切换键盘⼤⼩写状态76 MySetKeyBig(0);77// keybd_event只识别⼤写78 keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);79 keybd_event((BYTE)tmp[i]-32, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);80 }81else if ((tmp[i] >= 'A' && tmp[i] <= 'Z') || (tmp[i] >= '0' && tmp[i] <= '9'))82 {83 MySetKeyBig(1);84 keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);85 keybd_event((BYTE)tmp[i], NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);86 }87else88 {89 keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | 0, NULL);90 keybd_event((BYTE)tmp[i]+64, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);91 }92 }93// 恢复此操作之前的键盘状态94 MySetKeyBig(bOldState);95free(tmp);96 }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

vc模拟键盘输入
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('M', 0, 0 ,0);
keybd_event('M', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
方法1:
HWND hwnd=::FindWindow(0, "文档1"); //假设你要找的窗口标题为“文档1”CWnd::FromHandle(hwnd)->SetForegroundWindow();
::PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0L); //发送ESC按下的键盘消息
方法2:这里以向记事本程序发送Ctrl+s按键消息为例:
CWnd *pWnd = FindWindow("Notepad", NULL);
if (pWnd->GetSafeHwnd())
{
pWnd->ShowWindow(SW_NORMAL);
pWnd->SetForegroundWindow();
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event('S', 0, 0, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
keybd_event('S', 0, KEYEVENTF_KEYUP, 0);
}
对于其他程序,关键就是要找到就收消息的窗口句柄。

::mouse_event(1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。

VOID mouse_event(
DWORD dwFlags, // 鼠标动作标识。

DWORD dx, // 鼠标水平方向位置。

DWORD dy, // 鼠标垂直方向位置。

DWORD dwData, // 鼠标轮子转动的数量。

DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。

);
其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:MOUSEEVENTF_MOVE 表示模拟鼠标移动事件;
MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键;
MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键;
MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键;
MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键;
MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键;
MOUSEEVENTF_MIDDLEUP 表示模拟放开鼠标中键。

符号常量十六进制值指定的鼠标或键盘按键
VK_LBUTTON 01 鼠标左键
VK_RBUTTON 02 鼠标右键
VK_CANCEL 03 Control-break 过程
VK_MBUTTON 04 鼠标中键
VK_BACK 08 BACKSPACE 键
VK_TAB 09 TAB 键
VK_CLEAR 0C CLEAR 键
VK_RETURN 0D ENTER 键
VK_SHIFT 10 SHIFT 键
VK_CONTROL 11 CTRL 键
VK_MENU 12 ALT 键
VK_PAUSE 13 PAUSE 键
VK_CAPITAL 14 CAPS LOCK 键
VK_ESCAPE 1B ESC 键
VK_SPACE 20 SPACEBAR
VK_PRIOR 21 PAGE UP 键
VK_NEXT 22 PAGE DOWN 键
VK_END 23 END 键
VK_HOME 24 HOME 键
VK_LEFT 25 LEFT ARROW 键
VK_UP 26 UP ARROW 键
VK_RIGHT 27 RIGHT ARROW 键
VK_DOWN 28 DOWN ARROW 键
VK_SELECT 29 SELECT 键
VK_EXECUTE 2B EXECUTE 键
VK_SNAPSHOT 2C PRINT SCREEN键(用于Windows 3.0及以后版本)VK_INSERT 2D INS 键
VK_DELETE 2E DEL 键
VK_HELP 2F HELP 键
///////////////////////////////////////////////////
对于字母键和非小键盘上的数字键,直接在单引号中加入该键就行.
比如:
a键:'A'
1键:'1'
//////////////////////////////////////////////
VK_LWIN 5B Left Windows 键(Microsoft自然键盘)
VK_RWIN 5C Right Windows 键(Microsoft自然键盘)
VK_APPS 5D Applications 键(Microsoft自然键盘)
VK_NUMPAD0 60 数字小键盘上的0 键
VK_NUMPAD1 61 数字小键盘上的1 键
VK_NUMPAD2 62 数字小键盘上的2 键VK_NUMPAD3 63 数字小键盘上的3 键VK_NUMPAD4 64 数字小键盘上的4 键VK_NUMPAD5 65 数字小键盘上的5 键VK_NUMPAD6 66 数字小键盘上的6 键VK_NUMPAD7 67 数字小键盘上的7 键VK_NUMPAD8 68 数字小键盘上的8 键VK_NUMPAD9 69 数字小键盘上的9 键VK_MULTIPLY 6A Multiply 键
VK_ADD 6B Add 键
VK_SEPARATOR 6C Separator 键
VK_SUBTRACT 6D Subtract 键
VK_DECIMAL 6E Decimal 键
VK_DIVIDE 6F Divide 键
VK_F1 70 F1 键
VK_F2 71 F2 键
VK_F3 72 F3 键
VK_F4 73 F4 键
VK_F5 74 F5 键
VK_F6 75 F6 键
VK_F7 76 F7 键
VK_F8 77 F8 键
VK_F9 78 F9 键
VK_F10 79 F10 键
VK_F11 7A F11 键
VK_F12 7B F12 键
VK_F13 7C F13 键
VK_F14 7D F14 键
VK_F15 7E F15 键
VK_F16 7F F16 键
VK_F17 80H F17 键
VK_F18 81H F18 键
VK_F19 82H F19 键
VK_F20 83H F20 键
VK_F21 84H F21 键
VK_F22 85H F22 键
VK_F23 86H F23 键
VK_F24 87H F24 键
VK_NUMLOCK 90 NUM LOCK 键
VK_SCROLL 91 SCROLL LOCK 键
VK_ATTN F6 Attn 键
VK_CRSEL F7 CrSel 键
VK_EXSEL F8 ExSel 键
VK_EREOF F9 Erase EOF 键
VK_PLAY FA Play 键
VK_ZOOM FB Zoom 键
VK_OEM_CLEAR FE Clear 键。

相关文档
最新文档