Làm cách nào để tôi có thể lập trình tạo sự kiện mô phỏng một phím đang được nhấn trên bàn phím?
Làm cách nào để tôi có thể lập trình tạo sự kiện mô phỏng một phím đang được nhấn trên bàn phím?
Câu trả lời:
Câu hỏi được gắn thẻ WPF nhưng câu trả lời cho đến nay là WinForms và Win32 cụ thể.
Để thực hiện điều này trong WPF, chỉ cần tạo một KeyEventArgs và gọi RaiseEvent trên mục tiêu. Ví dụ: để gửi một sự kiện Chèn khóa KeyDown đến phần tử hiện được tập trung:
var key = Key.Insert; // Key to send
var target = Keyboard.FocusedElement; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key)
{ RoutedEvent=routedEvent }
);
Giải pháp này không dựa vào các cuộc gọi gốc hoặc nội bộ Windows nên đáng tin cậy hơn nhiều so với các giải pháp khác. Nó cũng cho phép bạn mô phỏng một lần nhấn phím trên một phần tử cụ thể.
Lưu ý rằng mã này chỉ áp dụng cho các sự kiện PreviewKeyDown, KeyDown, PreviewKeyUp và KeyUp. Nếu bạn muốn gửi các sự kiện TextInput, bạn sẽ thực hiện việc này thay thế:
var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(
new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text))
{ RoutedEvent = routedEvent }
);
Cũng lưu ý rằng:
Các điều khiển mong đợi nhận được các sự kiện Xem trước, ví dụ: PreviewKeyDown phải đứng trước KeyDown
Sử dụng target.RaiseEvent (...) gửi sự kiện trực tiếp đến đích mà không cần xử lý meta như trình tăng tốc, thành phần văn bản và IME. Đây thường là những gì bạn muốn. Mặt khác, nếu bạn thực sự làm những gì để mô phỏng các phím bàn phím thực tế vì lý do nào đó, bạn sẽ sử dụng InputManager.ProcessInput () để thay thế.
Keyboard.PrimaryDevice.ActiveSource
xem stackoverflow.com/questions/10820990/…
Ctrl+C
:)
Để tạo các sự kiện chính mà không có Ngữ cảnh của Windows Forms, Chúng tôi có thể sử dụng phương pháp sau,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
mã mẫu được đưa ra dưới đây:
const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28; //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
//Press the key
keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
return 0;
}
Danh sách các phím ảo được xác định tại đây .
Để có được bức tranh hoàn chỉnh, vui lòng sử dụng liên kết dưới đây, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Tôi chưa sử dụng nó, nhưng SendKeys có thể làm những gì bạn muốn.
Sử dụng SendKeys để gửi các tổ hợp phím và tổ hợp phím tới ứng dụng đang hoạt động. Không thể khởi tạo lớp này. Để gửi một tổ hợp phím tới một lớp và ngay lập tức tiếp tục với luồng chương trình của bạn, hãy sử dụng Gửi. Để đợi bất kỳ quá trình nào bắt đầu bằng cách nhấn phím, hãy sử dụng SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft có thêm một số ví dụ sử dụng ở đây .
Một cách dễ dàng! (bởi vì ai đó đã làm công việc cho chúng tôi ...)
Sau khi dành nhiều thời gian để cố gắng làm điều này với các câu trả lời được đề xuất, tôi đã xem qua dự án codeplex Windows Input Simulator này, nó làm cho nó đơn giản như có thể để mô phỏng một phím bấm:
Cài đặt gói, có thể được thực hiện hoặc từ trình quản lý gói NuGet hoặc từ bảng điều khiển trình quản lý gói như:
Install-Package InputSimulator
Sử dụng 2 dòng mã này:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
Và đó là nó!
-------BIÊN TẬP--------
Trang dự án trên codeplex bị gắn cờ vì lý do nào đó, đây là liên kết đến thư viện NuGet.
API SendMessage của Windows với gửi WM_KEYDOWN .