2008-10-05 16 views
8

Tôi đang viết chương trình C# để ghi lại tín hiệu từ thiết bị bên ngoài và gửi các lần nhấn phím đến một ứng dụng khác. Tôi đang sử dụng SendKeys và nó hoạt động tốt.Làm thế nào để ấn một phím và thả nó bằng C#?

SendKeys hiện "nhấn" một phím bằng cách giữ và nhả ngay lập tức. Tôi muốn làm cho nó đẩy chìa khóa và phát hành nó theo ý thích.

Câu hỏi của tôi là: "có cách nào để gửi tín hiệu" đẩy "tới một khóa hay không, sau đó tín hiệu" giải phóng "sau một khoảng thời gian nhất định?"

Tôi không chắc SendKeys có thể thực hiện việc này hay không. Bất kỳ đầu mối?

Trả lời

3

Bạn có thể sử dụng SendInput hoặc keyb_event, cả hai đều là các hàm API gốc. SendInput có một số ưu điểm so với keybd_event, nhưng SendInput chỉ có sẵn bắt đầu với XP.

Dưới đây là liên kết MSDN http://msdn.microsoft.com/en-us/library/ms646310.aspx

Hope this helps

1

Có lần tôi đã tìm cách để làm điều tương tự trên powerpoint, để che giấu con trỏ, và sau đó để ngăn chặn sự trình chiếu. Nhưng nó khó và phức tạp vì có nhiều cửa sổ cấp cao xuất hiện trong powerpoint, cũng khó để tìm ra phần nào của mô phỏng thất bại nếu nó không hoạt động. Sau khi nhìn vào hàng đợi thông điệp bằng cách sử dụng Spy ++, tôi nhận thấy rằng lệnh tăng tốc đã được gửi sau khi nhấn phím, vì vậy thay vào đó, tôi mô phỏng lệnh tăng tốc, và nó hoạt động như sự quyến rũ. Vì vậy, bạn có thể muốn xem xét thay thế như thế này.

4

Câu trả lời được chấp nhận sử dụng keybd_event không được dùng nữa. API chính thức hiện là SendInput. Ngoài ra còn có một wrapper tốt đẹp cho nó tại http://inputsimulator.codeplex.com.

Không có trường hợp nào ở trên, hoàn toàn phục vụ cho trường hợp "giữ phím". Điều này là do việc giữ chìa khóa sẽ tạo ra nhiều thông báo WM_KEYDOWN, theo sau là một thông báo WM_KEYUP duy nhất khi được phát hành (bạn có thể kiểm tra điều này bằng Spy ++).

Tần suất của các tin nhắn WM_KEYDOWN phụ thuộc vào phần cứng, cài đặt BIOS và một vài cài đặt Windows: KeyboardDelayKeyboardSpeed. Sau này có thể truy cập từ Windows Forms (SystemInformation.KeyboardDelay, SystemInformation.KeyboardSpeed).

Sử dụng thư viện Trình mô phỏng đầu vào nói trên, tôi đã triển khai phương pháp giữ phím bắt chước hành vi thực tế. Đó là await/async đã sẵn sàng và hỗ trợ hủy.

static Task SimulateKeyHold(VirtualKeyCode key, int holdDurationMs, 
          int repeatDelayMs, int repeatRateMs, CancellationToken token) 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    var ctr = new CancellationTokenRegistration(); 
    var startCount = Environment.TickCount; 
    Timer timer = null; 
    timer = new Timer(s =>   
    { 
     lock (timer) 
     { 
      if (Environment.TickCount - startCount <= holdDurationMs) 
       InputSimulator.SimulateKeyDown(key); 
      else if (startCount != -1) 
      { 
       startCount = -1; 
       timer.Dispose(); 
       ctr.Dispose();      
       InputSimulator.SimulateKeyUp(key); 
       tcs.TrySetResult(null); 
      } 
     } 
    }); 
    timer.Change(repeatDelayMs, repeatRateMs); 

    if (token.CanBeCanceled) 
     ctr = token.Register(() => 
         { 
          timer.Dispose(); 
          tcs.TrySetCanceled(); 
         }); 
    return tcs.Task; 
} 
+0

Cảm ơn bạn rất nhiều về đầu vào có giá trị này. – Larry

+0

Bạn được chào đón, có giá trị đầu vào là những gì tôi là tất cả về;) –

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