2011-12-01 49 views
7

Tôi đang phát triển một ứng dụng phải gửi một số phím hoặc sự kiện chuột đến cửa sổ hiện hoạt.Gửi sự kiện chuột và bàn phím

Tôi đang sử dụng lớp này: Chuột

using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace Mouse 
{ 
    public static class VirtualMouse 
    { 
     // import the necessary API function so .NET can 
     // marshall parameters appropriately 
     [DllImport("user32.dll")] 
     static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 

     // constants for the mouse_input() API function 
     private const int MOUSEEVENTF_MOVE = 0x0001; 
     private const int MOUSEEVENTF_LEFTDOWN = 0x0002; 
     private const int MOUSEEVENTF_LEFTUP = 0x0004; 
     private const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 
     private const int MOUSEEVENTF_RIGHTUP = 0x0010; 
     private const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 
     private const int MOUSEEVENTF_MIDDLEUP = 0x0040; 
     private const int MOUSEEVENTF_ABSOLUTE = 0x8000;  

     // simulates movement of the mouse. parameters specify changes 
     // in relative position. positive values indicate movement 
     // right or down 
     public static void Move(int xDelta, int yDelta) 
     { 
      mouse_event(MOUSEEVENTF_MOVE, xDelta, yDelta, 0, 0); 
     } 

     // simulates movement of the mouse. parameters specify an 
     // absolute location, with the top left corner being the 
     // origin 
     public static void MoveTo(int x, int y) 
     { 
      mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0); 
     } 

     // simulates a click-and-release action of the left mouse 
     // button at its current position 
     public static void LeftClick() 
     { 
      mouse_event(MOUSEEVENTF_LEFTDOWN, Control.MousePosition.X, Control.MousePosition.Y, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTUP, Control.MousePosition.X, Control.MousePosition.Y, 0, 0); 
     }  
     public static void RightClick() 
     { 
      mouse_event(MOUSEEVENTF_RIGHTDOWN, Control.MousePosition.X, Control.MousePosition.Y, 0, 0); 
      mouse_event(MOUSEEVENTF_RIGHTUP, Control.MousePosition.X, Control.MousePosition.Y, 0, 0); 
     } 
    } 
} 

Keyboard

using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace Mouse 
{ 
    public static class VirtualKeyboard 
    { 
     [DllImport("user32.dll")] static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);  
     public static void KeyDown(System.Windows.Forms.Keys key) 
     { 
      keybd_event((byte)key, 0, 0, 0); 
     } 

     public static void KeyUp(System.Windows.Forms.Keys key) 
     { 
      keybd_event((byte)key, 0, 0x7F, 0); 
     } 
    } 
} 

đây là mã của tôi thử nghiệm:

private void button1_Click(object sender, EventArgs e) 
{ 
    Thread.Sleep(2000);    
    VirtualMouse.Move(100, 100); 
    VirtualMouse.RightClick(); 
    VirtualKeyboard.KeyDown(System.Windows.Forms.Keys.A); 
    VirtualKeyboard.KeyUp(System.Windows.Forms.Keys.A); 
} 

Chuột di chuyển, nhưng d không gửi nhấp chuột. Bất kỳ ý tưởng? Làm cách nào để tôi có thể tiếp tục nhấn một lần? Tôi đã thử sử dụng thread.sleep giữa KeyDown và KeyUp và nó không hoạt động.

Trả lời

6

Có một dự án mã nguồn mở trên CodePlex (của Microsoft trang web mã nguồn mở)

của Windows Simulator Input (C# SendInput Wrapper - Mô phỏng bàn phím và chuột)

http://inputsimulator.codeplex.com/

Nó có các ví dụ và thực sự đơn giản để sử dụng.

+3

Chuột vẫn không làm việc ... – Manu

0

định nghĩa của bạn nên được Uint32:

private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x02; 
private const UInt32 MOUSEEVENTF_ABSOLUTE = 0x8000; 
private const UInt32 MOUSEEVENTF_LEFTUP = 0x04; 
private const UInt32 MOUSEEVENTF_RIGHTDOWN = 0x08; 
private const UInt32 MOUSEEVENTF_RIGHTUP = 0x10; 
Các vấn đề liên quan