Bagaimana saya bisa secara terprogram membuat acara yang akan mensimulasikan tombol yang ditekan pada keyboard?
Bagaimana saya bisa secara terprogram membuat acara yang akan mensimulasikan tombol yang ditekan pada keyboard?
Jawaban:
Pertanyaannya diberi tag WPF tetapi jawabannya sejauh ini adalah WinForms dan Win32 spesifik.
Untuk melakukan ini di WPF, cukup buat KeyEventArgs dan panggil RaiseEvent pada target. Misalnya, untuk mengirim acara Sisipkan KeyDown ke elemen yang saat ini difokuskan:
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 }
);
Solusi ini tidak bergantung pada panggilan asli atau internal Windows dan harus jauh lebih andal daripada yang lain. Ini juga memungkinkan Anda untuk mensimulasikan penekanan tombol pada elemen tertentu.
Perhatikan bahwa kode ini hanya berlaku untuk peristiwa PreviewKeyDown, KeyDown, PreviewKeyUp, dan KeyUp. Jika Anda ingin mengirim peristiwa TextInput, Anda akan melakukan ini sebagai gantinya:
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 }
);
Perhatikan juga bahwa:
Kontrol mengharapkan untuk menerima peristiwa Pratinjau, misalnya PreviewKeyDown harus mendahului KeyDown
Menggunakan target.RaiseEvent (...) mengirimkan peristiwa langsung ke target tanpa meta-processing seperti akselerator, komposisi teks, dan IME. Ini biasanya yang Anda inginkan. Di sisi lain, jika Anda benar-benar melakukan apa untuk mensimulasikan tombol keyboard sebenarnya karena alasan tertentu, Anda akan menggunakan InputManager.ProcessInput () sebagai gantinya.
Keyboard.PrimaryDevice.ActiveSource
lihat stackoverflow.com/questions/10820990/…
Ctrl+C
)
Untuk menghasilkan peristiwa kunci tanpa Konteks Formulir Windows, kita dapat menggunakan metode berikut,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
kode contoh diberikan di bawah ini:
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;
}
Daftar Kunci Virtual ditentukan di sini .
Untuk mendapatkan gambaran lengkapnya, silakan gunakan tautan di bawah ini, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Saya belum menggunakannya, tetapi SendKeys mungkin melakukan apa yang Anda inginkan.
Gunakan SendKeys untuk mengirim kombinasi tombol dan tombol ke aplikasi yang aktif. Kelas ini tidak dapat dibuat instance-nya. Untuk mengirim penekanan tombol ke kelas dan segera melanjutkan alur program Anda, gunakan Kirim. Untuk menunggu proses apa pun yang dimulai dengan penekanan tombol, gunakan SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft memiliki beberapa contoh penggunaan lainnya di sini .
Mudah! (karena orang lain sudah melakukan pekerjaan untuk kita ...)
Setelah menghabiskan banyak waktu mencoba ini dengan jawaban yang disarankan, saya menemukan proyek codeplex ini Windows Input Simulator yang membuatnya sesederhana mungkin untuk mensimulasikan penekanan tombol:
Instal paketnya, bisa dilakukan atau dari manajer paket NuGet atau dari konsol manajer paket seperti:
Instal-Paket InputSimulator
Gunakan 2 baris kode ini:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
Dan itu dia!
------- EDIT --------
Halaman proyek pada codeplex ditandai karena beberapa alasan, ini adalah tautan ke galeri NuGet.
Windows SendMessage API dengan send WM_KEYDOWN .