VB 5/6-Tipp 0599: Tastenkombinationen senden
von Wolfgang Erhardt
Beschreibung
In manchen Anwendungen ist es unumgänglich fremden Fenstern eine Tastenkombination zu senden. Das folgende Beispiel zeigt dies in allen Varianten.
Update am 24. Februar 2004 von Rick (Rick1966@web.de): Ein Fehler beim Finden des passenden Fensters wurde behoben.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: BringWindowToTop, EnumWindows, GetWindowTextA (GetWindowText), IsWindowVisible, SendMessageA (SendMessageByNum), SendMessageA (SendMessageByString), ShowWindow | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Projekt1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Optionsfeld-Steuerelement "Op" (Index von 0 bis 11) ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Rahmensteuerelement "Frame2" ' Steuerelement: Textfeld "Text2" auf Frame2 ' Steuerelement: Rahmensteuerelement "Frame1" ' Steuerelement: Textfeld "Text1" auf Frame1 ' Da es sehr oft vorkommt, das im Forum danach gefragt wird, ' wie man Texte an Eingabefelder oder Controls senden kann, hier ' 2 Methoden per SendKeys & API. Ich hoffe es hilft dem ein ' oder anderen Option Explicit Private Sub Command1_Click() Dim hWnd As Long Dim u As String If Op(0).Value Then _ Call SendMessageByString(Text2.hWnd, WM_SETTEXT, 0, Text1.Text) If Op(1).Value Then _ Text2.SetFocus: _ Call SendKeys(Text1.Text, True) If Op(2).Value Then _ Form2.Text2.SetFocus: _ Call SendKeys(Text1.Text, True) If Op(3).Value Then _ Call SendMessageByString(Form2.Text2.hWnd, WM_SETTEXT, 0, Text1.Text) If Op(4).Value Or Op(5).Value _ Or Op(10).Value Or Op(11).Value Then u = InputBox("Bitte Fenstertitle (Caption) eingeben)", "Eingabe") hWnd = FindWindowByCaption(LCase(u)) If hWnd = 0 Then MsgBox "Fenster nicht gefunden '" & _ u & "'", vbCritical, "Fehler" Else If Op(4).Value Then _ Call BringWindowToTop(hWnd): _ Call ShowWindow(hWnd, SW_RESTORE): _ Call SendKeys(Text1.Text, True) If Op(5).Value Then _ Call SendMessageByString(hWnd, WM_SETTEXT, 0, Text1.Text) If Op(10).Value Then _ Call BringWindowToTop(hWnd): _ Call ShowWindow(hWnd, SW_RESTORE): _ Call SendKeys("{ENTER}", True) If Op(11).Value Then _ Call SendMessageByNum(hWnd, WM_CHAR, 13, 0) End If End If If Op(6).Value Then _ Text2.SetFocus: _ Call SendKeys("{ENTER}") If Op(7).Value Then _ Call SendMessageByNum(Text2.hWnd, WM_CHAR, 13, 0) '13 steht hier für ASC(13) = Enter If Op(8).Value Then _ Form2.Text2.SetFocus: _ Call SendKeys("{ENTER}") If Op(9).Value Then Call SendMessageByNum(Form2.Text2.hWnd, WM_CHAR, 13, 0) '13 steht hier für ASC(13) = Enter End If End Sub Private Sub Form_Load() Form2.Show Me.Top = Form2.Top + Form2.Height End Sub Private Sub Form_Unload(Cancel As Integer) Unload Form2 End Sub Private Sub Op_Click(Index As Integer) Command1.Enabled = True End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then _ MsgBox "ENTER wurde gedrückt!", vbInformation, "Aktive Box" End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '--------- Anfang Formular "Form2" alias Form2.frm --------- ' Steuerelement: Rahmensteuerelement "Frame2" ' Steuerelement: Textfeld "Text2" auf Frame2 Option Explicit Private Sub Text2_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then _ MsgBox "ENTER wurde gedrückt!", vbInformation, "Inaktive Box" End Sub '---------- Ende Formular "Form2" alias Form2.frm ---------- '--------- Anfang Modul "Module1" alias Module1.bas --------- Declare Function SendMessageByString Lib "USER32" _ Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As String) As Long Declare Function ShowWindow Lib "user32.dll" ( _ ByVal hWnd As Long, _ ByVal nCmdShow As Long) As Long Declare Function EnumWindows Lib "USER32" ( _ ByVal lpEnumFunc As Long, _ ByVal lParam As Long) As Long Declare Function GetWindowText Lib "USER32" _ Alias "GetWindowTextA" ( _ ByVal hWnd As Long, _ ByVal lpString As String, _ ByVal cch As Long) As Long Declare Function BringWindowToTop Lib "USER32" ( _ ByVal hWnd As Long) As Long Declare Function IsWindowVisible Lib "USER32" ( _ ByVal hWnd As Long) As Long Declare Function SendMessageByNum Lib "USER32" _ Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Public Const SW_RESTORE = 9 Public Const WM_CHAR = &H102 Public Const WM_SETTEXT = &HC Public wHwnd As Long Private wText As String Public Function FindWindowByCaption(Caption As String) As Long wHwnd = 0 wText = Caption Call EnumWindows(AddressOf EnumWindowsProc, -1) FindWindowByCaption = wHwnd End Function Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim Text As String Dim nRet As Long Text = Space$(256) nRet = GetWindowText(hWnd, Text, Len(Text)) If nRet <> 0 And IsWindowVisible(hWnd) Then Text = Left$(Text, nRet) If LCase(Text) = LCase(wText) Then wHwnd = hWnd EnumWindowsProc = 0 Exit Function End If End If EnumWindowsProc = 1 End Function '---------- Ende Modul "Module1" alias Module1.bas ---------- '-------------- Ende Projektdatei Projekt1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 5 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von am 29.01.2011 um 13:26
gzhj
Kommentar von Reinhard am 17.02.2006 um 18:46
Hallo Rick,
Habe versucht Ihr Beispiel nachzuempfinden:
1. Habe eine .exe erstellt mit 2 Einagbefeldern, beim Start wird der Cursor auf das erste Eingabefeld gesetzt und wartet auf eine Eingabe, um dann in das 2. Feld zu springen.
2. Habe eine 2. Anwendung erstellt, die auf Knpofdruck die Handle-Nummer der 1. Anwendung ermittelt und dann mit
Call BringWindowToTop(thishandle): _
Call ShowWindow(thishandle, SW_RESTORE): _
Call SendKeys("abcd {ENTER}", True)
den Text an die 2. Anwendung schickt.
Testergebnis:
Manchmal kommt der Text auf Anhieb an,
meistens muss ich jedoch mehrmals den Button anklicken, bis endlich der Text in der 2. Anwendung ankommt.
Woran liegt das? Muss man Wartebefehle einbauen und wie?
Nur so nebenbei gefragt: Kann man bei obigen Calls die Doppelpunkte weglassen (deren Funktion ist mir nicht bekannt)
Kommentar von Timo am 30.08.2005 um 11:05
Hallo
Super Tipp. Hier kann man sich raussuchen, was man will. Einige Kommentare zu den Unterschieden der einzelnen Varianten wäre natürlich noch toll.
Kommentar von Bernhard Grieb am 21.01.2004 um 20:45
Hallo,
ich habe ein Anwendungsprogramm erworben und möchte nun in einem darin geöffneten Fenster eine Eingabe machen von meinem VB6 Programm. Die Eingabe, welche in meinem Programm generiert wird, sieht z.B so aus: ABC <Return>. Ich mache das z.Zt. von hand, was sehr umständlich ist. Das geht so: ich clicke an die Stelle in dem geöffneten Fenster, tippe "ABC" ein und drücke <Return>. Nächster Wert, usw.
Geht das, wenn ich zunächst die Stelle im Fenster mit der Maus fokussiere und dann automatisch den Eintrag von meinem VB6 Programm auslöse? Gibt es ein entsprechendes Beispiel?
Für Ihre Hilfe besten Dank.
MfG
Bernhard Grieb
Kommentar von Fini the Ghetto am 19.11.2003 um 13:17
Dieser tipp ist sehr sehr sehr sehr umständlich