2009-07-16 78 views
19

Tôi cần điều khiển ứng dụng khác bằng cách mô phỏng thao tác di chuyển chuột và bàn phím. Làm thế nào để thực hiện điều này trong C#? Thậm chí có thể không?Điều khiển ứng dụng khác bằng C#

+3

Có thể Jon Skeet là người duy nhất có thể làm điều đó :) –

+0

Có vẻ như một bản sao của http://stackoverflow.com/questions/412598/how-to-interact-with-an-application-programmatically. Tôi thấy rằng bằng cách tìm kiếm http://stackoverflow.com/search?q=Control+another+application –

+0

Tuy nhiên câu trả lời được chấp nhận cho câu hỏi này khác với câu trả lời được chấp nhận cho bản sao (cả hai đều cung cấp giải pháp hợp lý). –

Trả lời

35

Bạn đã nhìn White TestStack?

Mẫu mã:

Application application = Application.Launch("foo.exe"); 
Window window = application.GetWindow("bar", InitializeOption.NoCache); 

Button button = window.Get<Button>("save"); 
button.Click(); 

Tôi không nghĩ rằng nó có thể nhận được nhiều hơn thế. Thư viện được tạo bởi ThoughtWorks.

+0

có phải là một liên kết xấu hoặc đã làm codeplex chỉ cần ném một conniption? –

+0

Tôi đang cố gắng duyệt qua tài liệu của dự án White và nó bắt đầu đưa ra lỗi! BTW, 'Trắng' sẽ cung cấp cho bạn cách tiếp cận OO để kiểm soát các ứng dụng dựa trên Windows. – SolutionYogi

+0

Trắng có vẻ giống như một tuyến đường tốt. Tôi sẽ xem xét điều đó. – Salamander2007

1

Sử dụng SendMessage API Win32 gốc. DllImport phương pháp này từ User32.dll. Bạn có thể sử dụng API này để gửi cả bàn phím & thông điệp chuột

1

Bạn có thể sử dụng p/gọi, tôi đã đánh cắp các mã sau đây cho cú click chuột tại các điểm ngẫu nhiên vào một nút với một tay cầm nổi tiếng:

[Flags] 
    public enum MouseEventFlags 
    { 
     LEFTDOWN = 0x00000002, 
     LEFTUP = 0x00000004, 
     MIDDLEDOWN = 0x00000020, 
     MIDDLEUP = 0x00000040, 
     MOVE = 0x00000001, 
     ABSOLUTE = 0x00008000, 
     RIGHTDOWN = 0x00000008, 
     RIGHTUP = 0x00000010 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct Rectangle 
    { 
     public int X; 
     public int Y; 
     public int Width; 
     public int Height; 
    } 

    private static void Click(IntPtr Handle) 
    { 
     lock (typeof(MouseAction)) 
     { 
      Rectangle buttonDesign; 

      GetWindowRect(Handle, out buttonDesign); 
      Random r = new Random(); 

      int curX = 10 + buttonDesign.X + r.Next(100 - 20); 
      int curY = 10 + buttonDesign.Y + r.Next(60 - 20); 

      SetCursorPos(curX, curY); 
      //Mouse Right Down and Mouse Right Up 
      mouse_event((uint)MouseEventFlags.LEFTDOWN, curX, curY, 0, 0); 
      mouse_event((uint)MouseEventFlags.LEFTUP, curX, curY, 0, 0); 
     } 
    } 

    [DllImport("user32.dll")] 
    static extern bool SetCursorPos(int X, int Y); 

    [DllImport("user32.dll")] 
    private static extern void mouse_event(
     long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 

    [DllImport("user32.dll")] 
    static extern bool GetWindowRect(IntPtr hWnd, out Rectangle rect); 
1

bạn có thể sử dụng AutoIT, đó là phần mềm miễn phí và có phiên bản dll mà bạn có thể nhập vào C# (DllImport). Nó cho phép bạn bấm vào điều khiển, viết chuỗi để chỉnh sửa hộp, thực hiện lựa chọn combobox vv trên một ứng dụng khác từ C#.

0

Tôi cố gắng để làm như vậy: sử dụng chuột i sử dụng lớp này

(bạn cần phải thêm using System.Runtime.InteropServices;)

public class MouseClick1 //public is important here** 
    { 
     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); 


     private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
     private const int MOUSEEVENTF_LEFTUP = 0x04; 
     private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
     private const int MOUSEEVENTF_RIGHTUP = 0x10; 


     public int CoordX { get; set; }  
     public int CoordY { get; set; } 

       public void Click1() 
     { 

      Cursor.Position = new Point(CoordX, CoordY); 

      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 

     } 

    } 

và sau khi vào Form1 của bạn (giả sử tên là Form1) bạn có thể

public partial class form1 : Form 
    { 

MouseClick1 button1 = new MouseClick1(); 
MouseClick1 button2 = new MouseClick1(); 

[...]

public void Simulate_button1and2_Click(object sender, EventArgs e) 
    { 

     button1.CoordX = 1652; //random coordinates 
     button1.CoordY = 225; 
     button2.CoordX = 1650; 
     button2.CoordY = 250; 

     button1.Click1(); 
     button1.Click2(); 

}}

Để có tọa độ trên con trỏ của bạn, tôi sử dụng một bộ đếm thời gian và một label:

private void timer1_Tick(object sender, EventArgs e) 
     { 
      Coord.Text = Cursor.Position.X.ToString() + " : " + Cursor.Position.Y.ToString(); //Premet d'avoir les coord en direct 

     } 

tốt Làm việc với tôi.

Các vấn đề liên quan