Aracılığıyla paylaş


Klavye olaylarının simülasyonunu oluşturma (Windows Forms .NET)

Windows Forms, klavye girişini program aracılığıyla taklit etmek için birkaç seçenek sağlar. Bu makalede, bu seçeneklere genel bir bakış sağlanır.

Önemli

.NET 7 ve .NET 6 için Masaüstü Kılavuzu belgeleri yapım aşamasındadır.

SendKey'leri kullanma

Windows Forms, etkin uygulamaya tuş vuruşları göndermek için sınıfını sağlar System.Windows.Forms.SendKeys . Bir uygulamaya tuş vuruşları göndermek için iki yöntem vardır: SendKeys.Send ve SendKeys.SendWait. İki yöntem arasındaki fark, SendWait tuş vuruşu gönderildiğinde geçerli iş parçacığını engellemesi ve yanıt Send beklememesidir. hakkında SendWaitdaha fazla bilgi için bkz . Farklı bir uygulamaya tuş vuruşu göndermek için.

Dikkat

Uygulamanız çeşitli klavyelerle uluslararası kullanıma yönelikse, kullanımı SendKeys.Send öngörülemeyen sonuçlar verebilir ve bundan kaçınılmalıdır.

Arka planda, SendKeys giriş göndermek için eski bir Windows uygulaması kullanır. Bu uygulama, uygulamanın yönetici haklarıyla çalışmadığı beklenen modern Windows'ta başarısız olabilir. Eski uygulama başarısız olursa kod, giriş göndermek için otomatik olarak yeni Windows uygulamasını dener. Ayrıca, SendKeys sınıf yeni uygulamayı kullandığında, SendWait yöntem artık başka bir uygulamaya tuş vuruşları gönderirken geçerli iş parçacığını engellemez.

Önemli

Uygulamanız işletim sisteminden bağımsız olarak tutarlı davranışlara dayanırsa, app.config dosyanıza aşağıdaki uygulama ayarını ekleyerek sınıfını yeni uygulamayı kullanmaya zorlayabilirsiniz SendKeys .

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

sınıfını SendKeys yalnızca önceki uygulamayı kullanmaya zorlamak için değerini "JournalHook" kullanın.

Aynı uygulamaya tuş vuruşu göndermek için

SendKeys.Send sınıfının veya SendKeys.SendWait yöntemini çağırınSendKeys. Belirtilen tuş vuruşları, uygulamanın etkin denetimi tarafından alınır.

Aşağıdaki kod örneği, ALT ve AŞAĞI tuşlarına birlikte basılması benzetimini yapmak için kullanır Send. Bu tuş vuruşları denetimin ComboBox açılan listesini görüntülemesine neden olur. Bu örnekte ve ile a FormButtonComboBoxvarsayılır.

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

Farklı bir uygulamaya tuş vuruşu göndermek için

SendKeys.Send ve SendKeys.SendWait yöntemleri, tuş vuruşlarını genellikle tuş vuruşlarını gönderdiğiniz uygulama olan etkin uygulamaya gönderir. Tuş vuruşlarını başka bir uygulamaya göndermek için önce bunu etkinleştirmeniz gerekir. Başka bir uygulamayı etkinleştirmek için yönetilen bir yöntem olmadığından, diğer uygulamaya odaklanmak için yerel Windows yöntemlerini kullanmanız gerekir. Aşağıdaki kod örneği, Hesap Makinesi uygulama penceresini etkinleştirmek için ve SetForegroundWindow yöntemlerini çağırmak FindWindow için platform çağrısı kullanır ve ardından Hesap Makinesi uygulamasına bir dizi hesaplama yapmak için çağrı Send yapar.

Aşağıdaki kod örneği, Windows 10 Hesap makinesi uygulamasında tuşlara basma benzetimini yapmak için kullanır Send . İlk olarak başlığı Calculator olan bir uygulama penceresini arar ve ardından etkinleştirir. Etkinleştirildikten sonra tuş vuruşları 10 artı 10'un hesaplanması için gönderilir.

[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

OnEventName yöntemlerini kullanma

Klavye olaylarının benzetimini yapmanın en kolay yolu, olayı oluşturan nesnede bir yöntem çağırmaktır. Çoğu olay, bunları çağıran karşılık gelen bir yönteme sahiptir. Bu yöntem, örneğinOnKeyPress, deseninde On ve ardından EventNameşeklinde adlandırılır. Bu yöntemler korunduğundan ve denetim veya formun bağlamının dışından erişilemediğinden, bu seçenek yalnızca özel denetimler veya formlar içinde mümkündür.

Bu korumalı yöntemler klavye olaylarının benzetimini yapmak için kullanılabilir.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Bu olaylar hakkında daha fazla bilgi için bkz . Klavye olaylarını kullanma (Windows Forms .NET).

Ayrıca bkz.