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⽂档。
VC6讲座_键盘与鼠标编程
VC6讲座(十八)处理键盘和鼠标事件上一讲中我们学习了在MFC程序中使用定时器的方法,并成功地为Schedule添加了报警功能,现在的Schedule已具备了我们在第四讲中提出的基本功能,但是它使用起来仍然不太方便,添加、编辑和删除事件条目的操作都只能通过选取菜单中相应的命令或工具栏上相应的按钮来进行,Schedule还不能接受通过键盘输入的命令,对鼠标的支持也不够强,因此在本讲中,我准备介绍一下处理键盘和鼠标事件的方法,为Schedule添加相应的消息处理函数,并设计一个弹出式菜单,让它作为Schedule的关联菜单。
添加处理键盘输入事件的函数按照Windows程序设计的基本要求,一个WIN32应用程序应该能够处理来自键盘的用户输入,这些键盘输入将以消息的形式被发送到应用程序的窗口处理函数中。
在设计MFC 程序时,我们不用直接编写窗口处理函数,但需要利用ClassWizard来添加相应的消息处理函数。
现在让我们调出ClassWizard,选中CScheduleView类,准备把处理键盘输入的函数放在视类中,不过此时可以发现在Messages列表框中列出了多种与键盘输入有关的消息,例如WM_CHAR、WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP等等,面对这么多的消息,我们应该处理哪一条呢?上述几种消息可以分成两类,一类被称为按键消息(Keystroke Messages),即当用户按下和松开某个键时拥有输入焦点的程序收到的消息,包括有WM_KEYDOWN、WM_KEYUP等四种,它们通常被用来处理键盘命令,另一类被称为字符消息(Character Messages),窗口处理函数在接收到第一类按键消息后,一般都要调用TranslateMessage()函数,该函数检查按键是否对应着一个ASCII字符,如果是的话,就额外放置一条字符消息(即WM_CHAR)到窗口的消息队列之中,字符消息通常被用来处理文字输入。
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分别是你要点击的点的横坐标和纵坐标。
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中包含键的扫描码和标志位。
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函数来控制其他应用程序的进程。
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); }。
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 }。
用应用程序模拟键盘和鼠标按键
用应用程序模拟键盘和鼠标按键第一篇:用应用程序模拟键盘和鼠标按键用应用程序模拟键盘和鼠标按键在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。
对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。
有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。
这里主要是通过两个Windows API函数来实现的。
下面以VC++为例来介绍一下如何实现这两个功能。
本文示例代码模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数。
在VC里调用api函数是既简单又方便不过的事了。
首先介绍一下Keybd_event函数。
Keybd_event能触发一个按键事件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。
当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。
Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab。
第二个参数为扫描码,一般不用设置,用0代替就行第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”,第四个参数一般也是置0即可。
用如下代码即可实现模拟按下键,其中的XX表示XX键的虚拟键值,在这里也就是各键对应的键码,如''A''=65 keybd_event(65,0,0,0);keybd_event(65,0,KEYEVENTF_KEYUP,0);...mouse_event最好配合SetCursorPos(x,y)函数一起使用,与Keybd_event类似,mouse_event有五个参数,第一个为选项标志,为MOUSEEVENTF_LEFTDOWN时表示左键按下为MOUSEEVENTF_LEFTUP表示左键松开,向系统发送相应消息。
模拟鼠标的操作方法
模拟鼠标的操作方法
模拟鼠标的操作方法通常可以使用编程语言提供的相关函数或库来实现。
下面是一些常见的操作方法:
1. 鼠标移动:可以使用`MouseMove`函数来模拟鼠标的移动操作。
该函数接受两个参数,分别是鼠标移动到的目标位置的横坐标和纵坐标。
例如,
`MouseMove(x, y)`可以将鼠标移动到坐标为(x, y)的位置。
2. 鼠标点击:可以使用`MouseClick`函数来模拟鼠标的点击操作。
该函数接受一个参数,表示点击的按钮。
例如,`MouseClick("left")`表示模拟鼠标左键的点击操作。
3. 鼠标双击:可以使用`MouseDoubleClick`函数来模拟鼠标的双击操作。
该函数接受一个参数,表示双击的按钮。
例如,`MouseDoubleClick("left")`表示模拟鼠标左键的双击操作。
4. 鼠标拖动:可以使用`MouseDown`、`MouseMove`和`MouseUp`等函数来模拟鼠标的拖动操作。
首先使用`MouseDown`函数按下鼠标按钮,然后使用`MouseMove`函数移动鼠标到目标位置,最后使用`MouseUp`函数释放鼠标按钮。
例如,`MouseDown("left")`、`MouseMove(x, y)`和`MouseUp("left")`可以模拟鼠标左键的拖动操作。
需要注意的是,具体的操作方法可能因编程语言和操作系统的不同而有所差异。
鼠标模拟操作方法
鼠标模拟操作方法鼠标模拟操作是指利用软件或者编程方法来模拟鼠标的各种操作,以达到自动化操作的目的。
下面我将详细介绍鼠标模拟操作的几种常用方法和技巧,并附上相关代码示例。
一、鼠标模拟操作的原理鼠标模拟操作的原理是通过简单的鼠标动作和键盘按键的组合,模拟人对计算机的操作。
通过编程方式实现鼠标模拟操作,可以完全模拟人工操作,实现更高效、精准的操作。
二、鼠标模拟操作的应用场景1. 自动化测试:在进行软件或网站的自动化测试时,通过鼠标模拟操作可以自动点击、拖拽、输入等,模拟用户真实操作,提高测试效率。
2. 数据录入:对于一些需要大量数据录入的工作,可以借助鼠标模拟操作来自动化执行,减轻手动操作的负担。
3. 游戏外挂:有些游戏允许使用鼠标模拟操作的外挂,可以实现一些自动化操作,如自动打怪、自动走位等。
4. 网络爬虫:对于一些需要进行批量访问、点击、输入等操作的网络任务,可以使用鼠标模拟操作来实现自动化任务。
三、鼠标模拟操作的常用方法1. 鼠标点击操作:通过模拟鼠标左键、右键或中键的按下和释放来实现鼠标点击操作。
以下是使用Python中的pyautogui库实现鼠标点击的示例代码:pythonimport pyautogui# 鼠标左键点击pyautogui.click(x=100, y=100, button='left')# 鼠标右键点击pyautogui.click(x=100, y=100, button='right')# 鼠标中键点击pyautogui.click(x=100, y=100, button='middle')2. 鼠标移动操作:通过模拟鼠标的移动来改变鼠标的位置。
以下是使用pyautogui库实现鼠标移动的示例代码:pythonimport pyautogui# 获取当前鼠标位置current_x, current_y = pyautogui.position()# 将鼠标移动到指定位置(x, y)pyautogui.moveTo(x=200, y=200)# 将鼠标相对当前位置水平移动dx像素,垂直移动dy像素pyautogui.move(dx=50, dy=50)# 将鼠标相对当前位置垂直移动dy像素pyautogui.move(0, dy=50)3. 鼠标拖拽操作:通过模拟鼠标的按下、移动和释放来实现拖拽操作。
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 的成员摘要:提供将键击发送到应用程序的方法。
C语言鼠标操作方法及源码
C语言鼠标操作方法及源码C语言不是直接支持鼠标操作的,因为C语言是一种面向过程的编程语言,主要用于系统级编程和应用程序开发。
而鼠标操作通常是通过操作系统提供的图形界面库来实现的,如Windows中的WinAPI或Linux中的X窗口系统等。
在C语言中,可以使用图形界面库或API来实现鼠标操作。
以下是一个使用WinAPI实现鼠标操作的例子:```c#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg)case WM_MOUSEMOVE:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标移动事件printf("鼠标移动到坐标 (%d, %d)\n", xPos, yPos);break;}case WM_LBUTTONDOWN:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键按下事件printf("鼠标左键按下,坐标 (%d, %d)\n", xPos, yPos); break;}case WM_LBUTTONUP:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键松开事件printf("鼠标左键松开,坐标 (%d, %d)\n", xPos, yPos); break;}//其他鼠标事件的处理...}return DefWindowProc(hwnd, uMsg, wParam, lParam);int main//创建窗口HWND hwnd;WNDCLASS wc = {0};wc.lpfnWndProc = WindowProc;wc.hInstance = GetModuleHandle(NULL);wc.lpszClassName = TEXT("MyWindowClass");RegisterClass(&wc);hwnd = CreateWindowEx(0, TEXT("MyWindowClass"), TEXT("C语言鼠标操作示例"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL,wc.hInstance, NULL);ShowWindow(hwnd, SW_SHOWDEFAULT);}//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0))TranslateMessage(&msg);DispatchMessage(&msg);}return 0;```以上代码演示了一个简单的C语言程序,通过使用WinAPI,实现了基本的鼠标操作。
- 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。