Bagikan melalui


Cara mensimulasikan peristiwa keyboard (Formulir Windows .NET)

Formulir Windows menyediakan beberapa opsi untuk mensimulasikan input keyboard secara terprogram. Artikel ini menyediakan gambaran umum tentang opsi ini.

Penting

Dokumentasi Panduan Desktop untuk .NET 7 dan .NET 6 sedang dibangun.

Menggunakan SendKeys

Formulir Windows menyediakan System.Windows.Forms.SendKeys kelas untuk mengirim penekanan kunci ke aplikasi aktif. Ada dua metode untuk mengirim penekanan kunci ke aplikasi: SendKeys.Send dan SendKeys.SendWait. Perbedaan antara kedua metode adalah yang SendWait memblokir utas saat ini ketika penekanan tombol dikirim, menunggu respons, meskipun Send tidak. Untuk informasi selengkapnya tentang SendWait, lihat Untuk mengirim penekanan kunci ke aplikasi lain.

Perhatian

Jika aplikasi Anda ditujukan untuk penggunaan internasional dengan berbagai keyboard, penggunaan SendKeys.Send dapat menghasilkan hasil yang tidak dapat diprediksi dan harus dihindari.

Di balik layar, SendKeys menggunakan implementasi Windows yang lebih lama untuk mengirim input, yang mungkin gagal pada Windows modern di mana aplikasi diharapkan tidak berjalan dengan hak administratif. Jika implementasi yang lebih lama gagal, kode secara otomatis mencoba implementasi Windows yang lebih baru untuk mengirim input. Selain itu, ketika SendKeys kelas menggunakan implementasi baru, SendWait metode tidak lagi memblokir utas saat ini saat mengirim penekanan kunci ke aplikasi lain.

Penting

Jika aplikasi Anda bergantung pada perilaku yang konsisten terlepas dari sistem operasi, Anda dapat memaksa SendKeys kelas untuk menggunakan implementasi baru dengan menambahkan pengaturan aplikasi berikut ke file app.config Anda.

<appSettings>
  <add key="SendKeys" value="SendInput"/>
</appSettings>

Untuk memaksa SendKeys kelas hanya menggunakan implementasi sebelumnya, gunakan nilai "JournalHook" sebagai gantinya.

Untuk mengirim penekanan tombol ke aplikasi yang sama

SendKeys.Send Panggil metode atau SendKeys.SendWait kelas SendKeys . Penekanan kunci yang ditentukan akan diterima oleh kontrol aktif aplikasi.

Contoh kode berikut menggunakan Send untuk mensimulasikan penekanan tombol ALT dan DOWN bersama-sama. Penekanan ComboBox tombol ini menyebabkan kontrol menampilkan dropdown-nya. Contoh ini mengasumsikan Form dengan Button dan ComboBox.

private void button1_Click(object sender, EventArgs e)
{
    comboBox1.Focus();
    SendKeys.Send("%+{DOWN}");
}
Private Sub Button1_Click(sender As Object, e As EventArgs)
    ComboBox1.Focus()
    SendKeys.Send("%+{DOWN}")
End Sub

Untuk mengirim penekanan tombol ke aplikasi lain

Metode SendKeys.Send dan SendKeys.SendWait mengirim penekanan kunci ke aplikasi aktif, yang biasanya merupakan aplikasi tempat Anda mengirim penekanan kunci. Untuk mengirim penekanan tombol ke aplikasi lain, Pertama-tama Anda perlu mengaktifkannya. Karena tidak ada metode terkelola untuk mengaktifkan aplikasi lain, Anda harus menggunakan metode Windows asli untuk memfokuskan aplikasi lain. Contoh kode berikut menggunakan pemanggilan platform untuk memanggil FindWindow metode dan SetForegroundWindow untuk mengaktifkan jendela aplikasi Kalkulator, lalu memanggil Send untuk mengeluarkan serangkaian perhitungan ke aplikasi Kalkulator.

Contoh kode berikut menggunakan Send untuk mensimulasikan menekan tombol ke dalam aplikasi Kalkulator Windows 10. Ini pertama-tama mencari jendela aplikasi dengan judul Calculator dan kemudian mengaktifkannya. Setelah diaktifkan, penekanan tombol dikirim untuk menghitung 10 plus 10.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)
{
    IntPtr calcWindow = FindWindow(null, "Calculator");

    if (SetForegroundWindow(calcWindow))
        SendKeys.Send("10{+}10=");
}
<Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=Runtime.InteropServices.CharSet.Unicode)>
Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr : End Function

<Runtime.InteropServices.DllImport("USER32.DLL")>
Public Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean : End Function

Private Sub Button1_Click(sender As Object, e As EventArgs)
    Dim hCalcWindow As IntPtr = FindWindow(Nothing, "Calculator")

    If SetForegroundWindow(hCalcWindow) Then
        SendKeys.Send("10{+}10=")
    End If
End Sub

Menggunakan metode OnEventName

Cara term mudah untuk mensimulasikan peristiwa keyboard adalah dengan memanggil metode pada objek yang menaikkan peristiwa. Sebagian besar peristiwa memiliki metode yang sesuai yang memanggilnya, dinamai dalam pola On diikuti oleh EventName, seperti OnKeyPress. Opsi ini hanya dimungkinkan dalam kontrol atau formulir kustom, karena metode ini dilindungi dan tidak dapat diakses dari luar konteks kontrol atau formulir.

Metode yang dilindungi ini tersedia untuk mensimulasikan peristiwa keyboard.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Untuk informasi selengkapnya tentang peristiwa ini, lihat Menggunakan peristiwa keyboard (Formulir Windows .NET).

Baca juga