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.
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 SendWait
daha 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 Form Button ComboBoxvarsayı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.
.NET Desktop feedback