VC 模拟鼠标和键盘输入
模拟键盘鼠标

Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
参数wCode 表示待转换的码,参数wMapType 表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType 设置为0,如果是虚拟扫描码转虚拟码,则wMapType 设置为1,如果是虚拟码转ASCII码,则wMapType 设置为2.相信有了这些,我们就可以构造键盘事件的lParam参数了。下面给出一个构造lParam参数的函数:
WM_KEYUP 表示一个普通键被释放
WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键
WM_SYSKEYUP 表示一个系统键被释放,比如Alt键
如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000 00000000 00000000 00000000 一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还是释放键。大家一般习惯写成16进制的,那么就应该是&H00 00 00 00 ,第0-15位一般为&H0001,如果是按下键,那么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如下:
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。
模拟鼠标事件的实现思路及代码

模拟鼠标事件的实现思路及代码鼠标事件是指在计算机应用程序中,用户通过鼠标和其它输入设备进行操作时产生的一系列事件。
鼠标事件包括点击、双击、移动、按下和释放等操作,对于许多交互式应用程序来说,鼠标事件是非常重要的。
在本文中,我将介绍一种实现模拟鼠标事件的思路,并提供相关的代码示例。
实现思路:1.首先,需要确定要模拟的鼠标事件的类型。
常见的鼠标事件包括点击、双击、移动、按下和释放等。
根据所需的具体功能,选择相应的事件类型。
2.确定事件的触发方式。
鼠标事件可以通过多种方式触发,例如在窗口中点击鼠标按钮、按下键盘上的一些按键等。
3. 通过操作系统提供的API或库函数,模拟鼠标事件的产生。
不同的操作系统提供不同的API或库函数来模拟鼠标事件。
在Windows操作系统中,可以使用Win32 API提供的函数来模拟鼠标事件;在Linux操作系统中,可以使用X Window系统提供的函数来模拟鼠标事件;在Mac OS操作系统中,可以使用Quartz库提供的函数来模拟鼠标事件。
4.编写代码实现相应的模拟鼠标事件功能。
根据所选的编程语言和操作系统,编写代码来实现模拟鼠标事件的功能。
代码应包括鼠标事件的触发、产生和处理等逻辑。
代码示例:下面是一个使用C#语言在Windows操作系统上实现模拟鼠标点击事件的代码示例:```csharpusing System;class Program[DllImport("user32.dll")]public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);const uint MOUSEEVENTF_LEFTDOWN = 0x02;const uint MOUSEEVENTF_LEFTUP = 0x04;static void Main(string[] args)//模拟鼠标点击事件SimulateMouseClick(500, 500);}static void SimulateMouseClick(int x, int y)//移动鼠标到指定位置SetCursorPosition(x, y);//模拟鼠标按下并释放左键mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, UIntPtr.Zero);mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, UIntPtr.Zero);}static void SetCursorPosition(int x, int y)SetCursorPos(x, y);}[DllImport("user32.dll")]private static extern bool SetCursorPos(int X, int Y);```上述代码通过调用Windows提供的`mouse_event`函数,模拟鼠标点击事件。
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,内。
VC模拟鼠标键盘输入

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, // 鼠标水平方向位置。
C#实现以驱动方式(winio)模拟键盘鼠标(part1)

C#实现以驱动方式(winio)模拟键盘鼠标(part1)winio3.0下载:winio在win7 64w位系统无法使用解决办法: /wangqian0realmagic/我代码移植自作者yeye55 Delphi下利用WinIo模拟鼠标键盘详解你可以看成是此文一个 c#实现,具体原理性问题,请参照此文(mouse.ini 文件可参考此文实现,我暂时没移植)文件名WinIo.cs代码预览using System;using System.Text;using System.Runtime.InteropServices;using System.IO;using System.Drawing;namespace WinIoApi{public class WinIo{............}public class ScanKey{............}public class ScanKeyCode{.........}}具体实现public class WinIo{public const int KBC_KEY_CMD = 0x64;public const int KBC_KEY_DATA = 0x60;public const int KEY_CMD_DATA = 0xD2;public const int MOUSE_CMD_DATA = 0xD3;public const int SM_CXSCREEN=0;public const int SM_CYSCREEN=1;public static byte [] MousePacketData;public static bool [] MouseButtons;public static string AppPath = Environment.CurrentDirector y;[DllImport("winio32.dll")]public static extern bool InitializeWinIo();[DllImport("winio32.dll")]public static extern bool GetPortVal(IntPtr wPortAddr, out in t pdwPortVal, byte bSize);[DllImport("winio32.dll")]public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);[DllImport("winio32.dll")]public static extern byte MapPhysT oLin(byte pbPhysAddr, ui nt dwPhysSize, IntPtr PhysicalMemoryHandle);[DllImport("winio32.dll")]public static extern bool UnmapPhysicalMemory(IntPtr Phys icalMemoryHandle, byte pbLinAddr);[DllImport("winio32.dll")]public static extern bool GetPhysLong(IntPtr pbPhysAddr, b yte pdwPhysVal);[DllImport("winio32.dll")]public static extern bool SetPhysLong(IntPtr pbPhysAddr, by te dwPhysVal);[DllImport("winio32.dll")]public static extern void ShutdownWinIo();[DllImport("user32.dll")]private static extern int MapVirtualKey(uint Ucode, uint uMa pType);[DllImport("kernel32")]private static extern long WritePrivateProfileString(string sec tion, string key, string val, string filePath);[DllImport("kernel32")]private static extern int GetPrivateProfileString(string sectio n, string key, string def, StringBuilder retVal, int size, string filePa th);[DllImport("user32.dll")]private static extern int GetSystemMetrics(int nIndex);[DllImport("user32.dll")]private static extern bool GetCursorPos(out Point pt);private static bool initSucess = false;private static int [] moveConversion; public static string GetPath(string file) {return bine(AppPath, file);}public static bool Init(){if (InitializeWinIo()){initSucess = true; MousePacketData = new byte[4]; MouseButtons = new bool[3]; MouseButtons[0] = false; MouseButtons[1] = false; MouseButtons[2] = false; moveConversion=new int[256]; string filePath = GetPath("Mouse.ini"); if (ConversionFromIni(filePath)==false) {InitConversion();}return true;}else{initSucess = false;return false;}}public static void Shutdown(){if (initSucess){ShutdownWinIo();}}private static void KBCWait4IBE(){System.Threading.Thread.Sleep(10);int dwVal = 0;do{bool flag = GetPortVal((IntPtr)KBC_KEY_CMD, out dwVal, 1); }while ((dwVal & 0x1) > 0);}public static void KeyDown(ScanKeyCode scanKey){foreach (uint scanCode in scanKey.MakeCode){KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)KEY_CMD_DATA, 1); KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)scanCode, 1);}}public static void KeyUp(ScanKeyCode scanKey){foreach (uint scanCode in scanKey.BreakCode)KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)KEY_CMD_DATA, 1); KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)scanCode, 1);}}public static void MouseLeftKeyDown(){MouseButtons[0] = true;InitMouseData(0,0,0);SendMouseData();}public static void MouseLeftKeyUp(){MouseButtons[0] = false;InitMouseData(0,0,0);SendMouseData();}public static void MouseRightKeyDown(){MouseButtons[1] = true;InitMouseData(0,0,0);SendMouseData();}public static void MouseRightKeyUp(){MouseButtons[1] = false;InitMouseData(0,0,0);SendMouseData();public static void MouseMiddleKeyDown(){MouseButtons[2] = true;InitMouseData(0,0,0);SendMouseData();}public static void MouseMiddleKeyUp(){MouseButtons[2] = false;InitMouseData(0,0,0);SendMouseData();}public static void MouseMoveTo(int x,int y){MouseMoveTo(x,y,0,0);}public static void MouseMove(int cx,int cy){InitMouseData(cx,cy,0);SendMouseData();}public static void MouseWheel(int cz){InitMouseData(0,0,cz);SendMouseData();}public static void InitMouseData(int cx,int cy,int cz) {byte [] byteBit= {1,2,4,8,16,32};MousePacketData[0]=byteBit[3];if (MouseButtons[0]) {MousePacketData[0]=(byte)(MousePa cketData[0] | byteBit[0]);}if (MouseButtons[1]) {MousePacketData[0]=(byte)(MousePa cketData[0] | byteBit[1]);}if (MouseButtons[2]) {MousePacketData[0]=(byte)(MousePa cketData[0] | byteBit[2]);}if (cx < 0) { MousePacketData[0] = (byte)(MousePacketData[ 0] | byteBit[4]); }if (cy < 0) { MousePacketData[0] = (byte)(MousePacketData[ 0] | byteBit[5]); }MousePacketData[1]=(byte)(cx & 0xFF);MousePacketData[2]=(byte)(cy & 0xFF);MousePacketData[3]=(byte)(cz & 0xF);}public static void MouseMoveTo(int x,int y,int maxMove,int i nterval){Point p=new Point();int cX,cY,n;bool inLeft,inTop;if (maxMove<=0) {maxMove=0x7FFFFFFF;}p.X=GetSystemMetrics(SM_CXSCREEN)-1;if (x>p.X) {x=p.X;}p.Y=GetSystemMetrics(SM_CYSCREEN)-1;if (y>p.Y) {y=p.Y;}GetCursorPos(out p);inLeft=p.X<x?true:false; inTop=p.Y<y?true:false;while (!((((p.X<x)!=inLeft) || (p.X==x)) &&(((p.Y<y)!=inTop) || (p.Y==y)))){n=x-p.X;cX=fConversion(n,maxMove);p.X=p.X+n;//n=y-p.Y;cY = -fConversion(n, maxMove);p.Y=p.Y+n;//MouseMove(cX,cY);if (interval!=0) { System.Threading.Thread.Sleep(interval);};}}private static string ReadIniValue(string section, string key,st ring filePath){StringBuilder temp = new StringBuilder(255);int i = GetPrivateProfileString(section, key, "", temp, 255, file Path);return temp.T oString();}private static void InitConversion(){for(int i=0 ;i<=6;i++){moveConversion[i]=i;}for(int i=7;i<=255;i++){moveConversion[i]=i*2;}}private static bool ConversionFromIni(string iniFilePath){if (File.Exists(iniFilePath)){try{moveConversion[0] = 0;for (int i = 1; i <= 255; i++){moveConversion[i] = Convert.T oInt32(ReadIniValue("Conver sion", i.ToString(), iniFilePath));}return true;}catch{return false;}}else{return false;}private static int fConversion(int dis,int MaxMove) {int fi,fn;int result=0;if (dis==0){return result;}fn=Math.Abs(dis);if (fn>MaxMove){ fn=MaxMove;}for (fi=1;fi<=255;fi++){if(moveConversion[fi]>fn) {break;}if(moveConversion[fi]!=0) {result=fi;}}if (result==0){result=1;fn=1;}else { fn=moveConversion[result];}if (dis<0){dis=-fn;result=-result;}else {dis=fn;}return result;}private static void SendMouseData(){foreach (byte data in MousePacketData){KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)MOUSE_CMD_DATA, 1); KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)data, 1);}}。
电脑怎么仿真鼠标操作方法

电脑怎么仿真鼠标操作方法电脑仿真鼠标操作方法是指使用软件工具或编程语言模拟鼠标的各种操作,如移动、点击、双击、滚动等,以实现自动化操作或模拟用户行为的目的。
下面我将详细介绍电脑仿真鼠标操作的几种常见方法。
1. 模拟鼠标移动:在电脑上进行鼠标移动的仿真,可以使用一些软件工具或编程语言的库函数来实现。
比较常见的方法是使用Python编程语言的PyAutoGUI库,该库提供了一些函数可以模拟鼠标的移动操作。
例如,使用该库的moveTo()函数可以将鼠标移动到指定的坐标位置上。
2. 模拟鼠标点击:模拟鼠标点击是电脑仿真鼠标操作的一项重要任务。
一般可以通过调用操作系统提供的API函数,或使用第三方库实现。
比如,使用Python编程语言的PyAutoGUI库的click()函数可以实现模拟鼠标点击。
该函数可以指定点击的坐标位置,也可以传入可选参数来定义点击的类型(左键、右键、中键)。
3. 模拟鼠标双击:模拟鼠标双击是鼠标操作的一种常见需求。
同样可以通过调用操作系统API函数或使用特定库来实现。
比如,使用PyAutoGUI库的doubleClick()函数可以实现模拟鼠标的双击操作。
该函数与click()函数类似,只是会在两次点击之间添加一个较短的时间间隔。
4. 模拟鼠标滚动:模拟鼠标滚动操作常用于浏览网页或滚动文档等场景。
在电脑上,可以通过调用操作系统API函数或使用特定库来实现鼠标滚动的仿真。
具体实现方法会根据所使用的编程语言或工具而有所不同。
比如,在Python编程语言中,可以使用PyAutoGUI库的scroll()函数来实现鼠标滚动。
该函数可以指定滚动的距离和方向。
5. 模拟鼠标拖拽:模拟鼠标拖拽是一种常见的操作,常用于拖拽文件、调整窗口大小等场景。
通过调用操作系统API函数或使用特定库,可以实现鼠标拖拽的仿真。
例如,使用PyAutoGUI库的dragTo()函数可以实现鼠标拖拽操作。
该函数可以指定拖拽的起始坐标和终止坐标。
利用VisualC#编程模拟鼠标操作

有时,我们需在我们的程序中模拟⿏标的移动、点击等动作。
——⽐如,⼀个再现⽤户操作的宏,或者⼀个演⽰操作⽅法的Demo程序。
那么,我们在.net中如何实现呢? .Net并没有提供改变⿏标指针位置、模拟点击操作的函数;但是Windows API提供了。
其中⼀个是:[DllImport("user32.dll")]static extern bool SetCursorPos(int X, int Y); 该函数可以改变⿏标指针的位置。
其中X,Y是相对于屏幕左上⾓的绝对位置。
另⼀个函数是:[DllImport("user32.dll")]static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo); 这个函数不仅可以设置⿏标指针绝对的位置,⽽且可以以相对坐标来设置。
另外,该函数还可以模拟⿏标左右键点击、⿏标滚轮操作等。
其中的MouseEventFlag是⼀个基于uint类型的枚举,定义如下:[Flags]enum MouseEventFlag : uint{Move = 0x0001,LeftDown = 0x0002,LeftUp = 0x0004,RightDown = 0x0008,RightUp = 0x0010,MiddleDown = 0x0020,MiddleUp = 0x0040,XDown = 0x0080,XUp = 0x0100,Wheel = 0x0800,VirtualDesk = 0x4000,Absolute = 0x8000} 关于这两个函数的详细说明,可以查看MSDN Library或者Windows的Platform SDK⽂档。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 < length;index++) { int val = text[index];if(val >= 97 && val <= 122) //小写a-z {val -= 32; bShift = false; } else if(val>= 65 && val <= 90) //大写A-Z { bShift = true;} else if(val >= 48 && val <= 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 '&':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'\"': val = 222; bShift = true;break; case ',': val = 188;bShift = false; break; case '<': val = 188; bShift = true;break; case '.': val = 190;bShift = false; break; case '>':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); } }但是要注意,如果用户默认是中文输入法,那我们得先想办法切换到英文输入法才行。
到网上看到一篇文章,说的是在WinCE下的法:/iVincentFeng/archive/2010/04/20/KeyboardInput Simulation_SendMessage_keybd_event_PostKeybdMessage.html但是后来发现,如果我们想写入中文字符,怎么办呢??我开始的思路是像控制输入法的切换状态,来实现。
其实,我们只需找到我们需要输入的控件,然后填入中文字符就行了。
我用"按键精灵"找到控件的名称等相关信息,然后用下面的代码来遍历,之后填充数据即可。
[cpp]wchar_t sPath[]=_T("niha风范股份围观"); CWnd * pWnd =FindWindow(NULL,_T("另存为")); CString sCtrlName; CWnd *pedit;CString filename; wchar_t *buf=new wchar_t[512]; if(pWnd) {CWnd *pwnd=pWnd->GetWindow(GW_CHILD);//枚举保存对话框的所有子控件while(pwnd!=NULL) {::GetClassName(pwnd->GetSafeHwnd(),buf,512);//得到枚举的控件是什么类型的,CString str=buf; str.TrimRight();if(str==_T("ComboBoxEx32"))//如果枚举到保存文件名的EDIT{ pedit=pwnd;//保存EDIT句柄用来发消息pwnd->SendMessage(WM_SETTEXT,sizeof(sPath)/sizeof(wchar_t),(LPARAM)(void*)sPath);UpdateData(FALSE); break; }pwnd = pwnd->GetNextWindow(); }} delete [] buf; SetCursorPos(512+r2.left,366+r2.top);//按钮【保存】mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );想想,如果把坐标的操作全部转化为控件指针来处理,也许更安全,这样,不管客户那边的分辨率和中途改变窗口,我们的操作依然正确。
下面是附带的一点代码:[cpp]if(str=="保存(&S)")//如果是保存按钮{lstrcpy(BUF,(LPCTSTR)sPath);//sPath表示我们要设置的对话框浏览目录//发消息设置文件名EDIT为我们的路径名,完成第二步pedit->SendMessage(WM_SETTEXT,0,(LPARAM)BUF); //发消息模拟点击保存按钮,完成第三步::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONDOWN,0,0);::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONUP,0,0); }[cpp]//发消息还原EDIT里的文件名,完工! pedit->SendMessage(WM_SETTEXT,0,(LPARAM)filename);附带一个链接,自认为比较好的一篇文章:点击打开链接OK ,就此为止,有什么不正确的地方,欢迎大家指正,共同进步..!!!查看文档来源:/ypist/article/details/7472703。