Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0599: Tastenkombinationen senden

 von 

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 (): Ein Fehler beim Finden des passenden Fensters wurde behoben.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

BringWindowToTop, EnumWindows, GetWindowTextA (GetWindowText), IsWindowVisible, SendMessageA (SendMessageByNum), SendMessageA (SendMessageByString), ShowWindow

Download:

Download des Beispielprojektes [4,42 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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