c#模拟鼠标键盘操作

[DllImport("user32.dll")] 
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 
[DllImport("user32.dll")] 
static extern byte MapVirtualKey(byte wCode, int wMap);

        private void button2_Click(object sender, EventArgs e) 
{

            Process.Start(@"cs.txt"); 
Thread.Sleep(Convert.ToInt32(2 * 1000));//开起程序后等待


keybd_event(18, MapVirtualKey(18, 0), 0, 0); //按下CTRL鍵。    
//keybd_event(70, MapVirtualKey(70, 0), 0, 0);//鍵下f鍵。    
//keybd_event(70, MapVirtualKey(70, 0), 0x2, 0);//放開f鍵。  0x35  
Thread.Sleep(Convert.ToInt32(10 * 1000));//开起程序后等待 
keybd_event(18, MapVirtualKey(18, 0), 0x2, 0);//放開CTRL鍵。   

        }


//模拟键盘动作API函数keydb_event,它可以模拟对键盘上的某个或某些键进行按下 
//或放开的动作。

        //   VOID keybd_event( 
//     BYTE bVk, // 虚拟键值。 
//     BYTE bScan, // 硬件扫描码。 
//     DWORD dwFlags, // 动作标识。 
//     DWORD dwExtraInfo // 与键盘动作关联的辅加信息。 
//   );

        // 其中,bVk表示虚拟键值,其实它是一个BYTE类型值的宏,其取值范围为1-254。有 
//关虚拟键值表请在MSDN上使用

        //关键字“Virtual-Key Codes”查找相关资料。bScan表示当键盘上某键被按下和放开 
//时,键盘系统硬件产生的扫描码

        //,我们可以MapVirtualKey()函数在虚拟键值与扫描码之间进行转换。dwFlags表示各种 
//各样的键盘动作,它有两种取

        //值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。

        // 下面我们使用一段代码实现在游戏中按下Shift+R快捷键对攻击对象进行攻击。

        //   keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL 
//键。 
//   keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//键下R键。 
//   keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放开R键。 
//   keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0), 
//   KEYEVENTF_KEYUP,0);//放开CTRL键。

        //函数功能:该函数合成一次击键事件。系统可使用这种合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息,键盘驱动程序的中断处理程序调 用keybd_event函数。在Windows   NT中该函数己被使用Sendlhput来替代它。   

        //          函数原型;VOID   keybd_event(BYTE   bVk,BYTE   bScan,DWORD   dwFlags,DWORD   dwExtralnfo);   

        //          参数:   

        //          bVk:定义一个虚据拟键码。键码值必须在1~254之间。   

        //          bScan:定义该键的硬件扫描码。   

        //          dwFlags:定义函数操作的名个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。   

        //          KEYEVENTF_EXETENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。DEYEVENTF_KEYUP:若指定 该值,该键将被释放;若未指定该值,该键交被接下。dwExtralnfo:定义与击键相关的附加的32位值。   

        //          返回值:该函数无返回值。   

        //          备注:尽管keybd_event传递一个与OEM相关的硬件扫描码给系统,但应用程序不能用此扫描码。系统在内部将扫描码转换成虚拟键码,并且在传送给 应用程序前清除键码的UP/down位。应用程序可以摸拟PRINTSCREEN键的按下来获得一个屏幕快照,并把它存放到剪切板中。若要做到这一点,则 要将keybd_event的bVk参数置为VK_SNAPSHOT,bScan参数置为0(用以获得全屏快照)或hScan置为1(仅获得活动窗口的快 照)。Windows   CE:WindowsCE支持dwFlags参数附加的标志位。即使用KEYEVENTF_SILENT标志模拟击键,而不产生敲击的声音。 Windows   CE不支持KEYEVENTF_EXTENDEDKEY标志。

        //或者

        private void MySendKeys()//输入用户名密码 

SendKeys.SendWait("%f");//alt+f 
foreach (char ArrayValue in via.UserName.ToCharArray()) 

SendKeys.SendWait(ArrayValue.ToString()); 
Thread.Sleep(10); 

SendKeys.SendWait("{Tab}"); 
foreach (char ArrayValue in via.Pwd.ToCharArray()) 

SendKeys.SendWait(ArrayValue.ToString()); 
Thread.Sleep(10); 

SendKeys.SendWait("{Enter}");

        }
* 十进制值 标识符 IBM兼容键盘 

--------------------------------------------------------------------------------

1    VK_LBUTTON   鼠标左键 
2    VK_RBUTTON   鼠标右键 
3    VK_CANCEL   Ctrl+Break(通常不需要处理) 
4    VK_MBUTTON   鼠标中键 
8    VK_BACK    Backspace 
9    VK_TAB     Tab 
12   VK_CLEAR    Num Lock关闭时的数字键盘5 
13   VK_RETURN   Enter(或者另一个) 
16   VK_SHIFT    Shift(或者另一个) 
17   VK_CONTROL   Ctrl(或者另一个) 
18   VK_MENU    Alt(或者另一个) 
19   VK_PAUSE    Pause 
20   VK_CAPITAL   Caps Lock 
27   VK_ESCAPE   Esc 
32   VK_SPACE    Spacebar 
33   VK_PRIOR    Page Up 
34   VK_NEXT    Page Down 
35   VK_END     End 
36   VK_HOME    Home 
37    VK_LEFT    左箭头 
38   VK_UP     上箭头 
39   VK_RIGHT   右箭头 
40   VK_DOWN    下箭头 
41   VK_SELECT   可选 
42   VK_PRINT   可选 
43   VK_EXECUTE  可选 
44   VK_SNAPSHOT  Print Screen 
45   VK_INSERT   Insert 
46   VK_DELETE  Delete 
47   VK_HELP   可选 
48~57  无      主键盘上的0~9 
65~90  无      A~Z 
96~105  VK_NUMPAD0~VK_NUMPAD9   Num Lock打开时数字键盘上的0~9 
106   VK_NULTIPLY         数字键盘上的* 
107   VK_ADD           数字键盘上的+ 
108   VK_SEPARATOR        可选 
109   VK_SUBTRACT         数字键盘上的- 
110   VK_DECIMAL         数字键盘上的. 
111   VK_DIVIDE          数字键盘上的/ 
112~135 VK_F1~VK_F24        功能键F1~F24 
144   VK_NUMLOCK         Num Lock 
145   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分别是你要点击的点的横坐标和纵坐标 

模拟鼠标键盘 注意:不支持Windows 8 / 8.1。 Interceptor是Windows键盘驱动程序的包装器(包装http://oblita.com/Interception)。 使用驱动程序,Interceptor可以模拟按键和鼠标点击... 使用DirectX的游戏,通常不接受使用SendInput()的击键 Windows的受保护区域,如Windows登录屏幕或UAC调暗屏幕 任何应用程序 因为驱动程序模拟击键和鼠标单击,所以目标窗口必须处于活动状态(即,在发送击键和鼠标点击时,不能在另一个窗口上执行多任务)。 如何使用 下载并构建此项目并在项目中引用其DLL。 下载'interception.dll',这是一个由驱动程序作者编写的独立库。将它放在与可执行文件相同的目录中。这是必需的。 从作者的网页下载并安装“install-interception.exe”。安装后重新启动计算机。 在您的代码中,要加载驱动程序,请调用(阅读下面的代码注释;您必须设置过滤模式以捕获按键事件或发送按键操作!): Input input = new Input(); // Be sure to set your keyboard filter to be able to capture key presses and simulate key presses // KeyboardFilterMode.All captures all events; 'Down' only captures presses for non-special keys; 'Up' only captures releases for non-special keys; 'E0' and 'E1' capture presses/releases for special keys input.KeyboardFilterMode = KeyboardFilterMode.All; // You can set a MouseFilterMode as well, but you don't need to set a MouseFilterMode to simulate mouse clicks // Finally, load the driver input.Load(); 做你的东西。 input.MoveMouseTo(5, 5); // Please note this doesn't use the driver to move the mouse; it uses System.Windows.Forms.Cursor.Position input.MoveMouseBy(25, 25); // Same as above ^ input.SendLeftClick(); input.KeyDelay = 1; // See below for explanation; not necessary in non-game apps input.SendKeys(Keys.Enter); // Presses the ENTER key down and then up (this constitutes a key press) // Or you can do the same thing above using these two lines of code input.SendKeys(Keys.Enter, KeyState.Down); Thread.Sleep(1); // For use in games, be sure to sleep the thread so the game can capture all events. A lagging game cannot process input quickly, and you so you may have to adjust this to as much as 40 millisecond delay. Outside of a game, a delay of even 0 milliseconds can work (instant key presses). input.SendKeys(Keys.Enter, KeyState.Up); input.SendText("hello, I am typing!"); /* All these following characters / numbers / symbols work */ input.SendText("abcdefghijklmnopqrstuvwxyz"); input.SendText("1234567890"); input.SendText("!@#$%^&*()"); input.SendText("[]\\;',./"); input.SendText("{}|:\"?"); // And finally input.Unload(); 笔记: BadImageFormatException如果您没有为解决方案中的所有项目(包括此项目)使用正确的体系结构(x86或x64),则可能会获得。因此,您可能必须下载此项目的源代码才能将其重建为正确的体系结构。这应该很简单,构建过程应该没有错误。 您必须从http://oblita.com/Interception下载'interception.dll' 。 如果你已经完成了以上所有操作(正确安装了拦截驱动程序,将interception.dll放在你的项目文件夹中),你仍然无法发送击键: 驱动程序有一个限制,即它不能在不接收至少一次击键的情况下发送击键。这是因为驱动程序不知道键盘是哪个设备ID,因此它必须等待接收击键以从击键中推断出设备ID。 总之,在发送击键之前,请始终按键盘一次。点按任意键。然后你可以发送击键。这不适用于接收击键,因为通过接收击键,您当然已经按下了一个键。 MoveMouseTo()和MoveMouseBy()完全忽略键盘驱动程序。它使用System.Windows.Forms.Position来设置和获取游标的位置(它为下面的各个函数调用标准的Win32 API)。 原因是,在探索键盘驱动程序的鼠标移动功能时,我注意到它没有按像素单位移动光标,而是似乎通过加速移动光标。当我想将光标移动到某个位置时,这会不断产生不一致的值。因为Win32游标设置API通常不被游戏等阻止,所以我发现只需调用这些标准API即可,而无需使用驱动程序。请注意,这仅适用于设置光标位置。拦截光标仍然可以正常工作。例如,您可以使用Interceptor反转鼠标的x和y轴。
WinAPI-Wrapper 模拟鼠标点击 用于模拟鼠标移动、点击、窗口操作等的Windows API包装器类。 API 下面是一些可用的方法的总结。有更多的方法和类,比下面列出的要多,但目的是要大致了解包装器能做什么。要查看关于特定方法的详细信息和参数的详细信息,请查看代码本身,因为它的注释很好。 Mouse.cs public static void LeftClick(); public static void RightClick(); public static void MiddleClick(); public static void LeftDown(); public static void LeftUp(); public static void RightDown(); public static void RightUp(); public static void MiddleDown(); public static void MiddleUp(); public static void Move(int x, int y); public static void LeftDrag(Point point1, Point point2, int interval, int lag); Window.cs public static bool DoesExist(string windowTitle); public static IntPtr Get(string windowTitle); public static IntPtr GetFocused(); public static void SetFocused(IntPtr hWnd); public static bool IsFocused(IntPtr hWnd); public static void Move(IntPtr hWnd, int x, int y); public static void Resize(IntPtr hWnd, int width, int height); public static void Hide(IntPtr hWnd); public static void Show(IntPtr hWnd); public static Rectangle GetDimensions(IntPtr hWnd); public static Size GetSize(IntPtr hWnd); public static Point GetLocation(IntPtr hWnd); public static string GetTitle(IntPtr hWnd); public static void SetTitle(IntPtr hWnd, string title); public static void Maximize(IntPtr hWnd); public static void Minimize(IntPtr hWnd); public static void Normalize(IntPtr hWnd); public static Bitmap Screenshot(IntPtr hWnd); public static void RemoveMenu(IntPtr hWnd); public static void Close(IntPtr hWnd); public static void DisableCloseButton(IntPtr hWnd); public static void DisableMaximizeButton(IntPtr hWnd); public static void DisableMinimizeButton(IntPtr hWnd); public static void EnableMouseTransparency(IntPtr hWnd); public static Point ConvertToWindowCoordinates(IntPtr hWnd, int x, int y); public static Point GetCoordinateRelativeToWindow(IntPtr hWnd); Desktop.cs public static Bitmap Screenshot(); public static void HideTaskBar(); public static void ShowTaskBar(); public static int GetWidth(); public static int GetHeight(); 使用 在windows api文件夹中编译代码会产生一个.dll文件。任何引用这个.dll的ccode都可以使用包装器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值