Klavye olaylarının benzetimini (Windows Forms .NET)
Windows Forms, klavye girişinin simülasyonu için birkaç seçenek sunar. Bu makalede bu seçeneklere genel bir bakış sunulmaktadır.
Önemli
.NET 6 ve .NET 5 için Masaüstü Kılavuzu belgeleri (.NET Core 3.1 dahil) hazır aşamasındadır.
SendKeys kullanma
Windows Forms, System.Windows.Forms.SendKeys etkin uygulamaya tuş vuruşları göndermek için sınıfını sağlar. Bir uygulamaya tuş vuruşu göndermek için iki yöntem vardır: SendKeys.Send ve SendKeys.SendWait . İki yöntem arasındaki fark, tuş vuruşu gönderiken geçerli iş parçacığını engellemesi ve yanıt beklemesi ancak SendWaitSend engellemesidir. hakkında daha fazla bilgi SendWait için SendWait
Dikkat
Uygulamanız çeşitli klavyelerle uluslararası kullanım için tasarlanmışsa, kullanımı öngörülemeyen SendKeys.Send sonuçlar verir ve kaçınılmalıdır.
Arkalarında, giriş Windows eski bir uygulama kullanır ve bu uygulamanın yönetim haklarıyla Windows beklenen modern modellerde SendKeys başarısız olabilir. Eski uygulama başarısız olursa kod, giriş göndermek için yeni Windows otomatik olarak yeniden çalışır. Ayrıca, sınıfı yeni uygulamayı kullandığında, yöntem artık başka bir uygulamaya tuş vuruşları gönderirken geçerli SendKeysSendWait iş parçacığını engellemez.
Önemli
Uygulamanız işletim sisteminden bağımsız olarak tutarlı bir davranışa bağlı ise, aşağıdaki uygulama ayarını uygulama dosyanıza ekleyerek sınıfı yeni uygulamayı SendKeys kullanmaya app.config yapabilirsiniz.
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
Sınıfını SendKeys yalnızca önceki SendKeys kullanmaya zorlamak için değerini "JournalHook" kullanın.
Aynı uygulamaya tuş vuruşu göndermek için
sınıfının SendKeys.Send veya SendKeys.SendWait yöntemini SendKeys çağırma. Belirtilen tuş vuruşları uygulamanın etkin denetimi tarafından alınmıştır.
Aşağıdaki kod örneği ALT ve Send DOWN tuşlarına Sendyapmak için kullanır. Bu tuş vuruşları denetimin ComboBox açılan liste görüntülemesini sağlar. Bu örnekte, ve ile Form bir olduğu ButtonComboBox varsaydı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
ve yöntemleri, tuş vuruşlarını etkin uygulamaya gönderir. Bu, genellikle tuş SendKeys.SendSendKeys.SendWait vuruşlarını göndermekte olduğu uygulamadır. Tuş vuruşlarını başka bir uygulamaya göndermek için öncelikle uygulamayı etkinleştirmeniz gerekir. Başka bir uygulamayı etkinleştirmek için yönetilen yöntem yoktur, diğer uygulamaya odaklanmak için yerel Windows yöntemleri kullanabilirsiniz. Aşağıdaki kod örneği, Hesap makinesi uygulama penceresini etkinleştirmek için ve yöntemlerini çağırmak için platform çağırmayı kullanır ve ardından Hesap makinesi uygulamasına bir dizi hesaplama FindWindowSetForegroundWindow yapmak için çağrıları Send kullanır.
Aşağıdaki kod örneği, Windows 10 Send Calculator uygulamasına tuş basma Windows 10 kullanır. İlk olarak başlığına sahip bir uygulama penceresi Calculator arar ve ardından etkinleştirir. Etkinleştirildikten sonra tuş vuruşları 10 artı 10 değerini hesaplamak 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ı simüle etmenin en kolay yolu, olayı yükselten nesnede bir yöntem çağrısı yapmaktır. Çoğu olay, bunları çağıran, desende ve ardından gibi On bir EventName yöntemine sahip OnKeyPress olur. Bu yöntemler korumalı olduğundan ve denetim ya da formun bağlamı dışından erişilemediklerinden, bu seçenek yalnızca özel denetimler veya formlar içinde mümkündür.
Bu korumalı yöntemler, klavye olaylarını simüle etmek için kullanılabilir.
OnKeyDownOnKeyPressOnKeyUp
Bu olaylar hakkında daha fazla bilgi için bkz. Klavye olaylarını kullanma (Windows Forms .NET).