Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1200to1204
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Probleme mit Sendmessage

Probleme mit Sendmessage
Fettertiger
Hallo liebe Experten,
jetzt kämpfe ich schon seit Stunden damit ein einfaches "Sendkeys" bzw Sendmessage Problem zu lösen. Mein Problem ist, dass ich einen Dateinamen an einen geöffneten Filedialog in einer externen Application übergeben will. Der Dialog dort sieht fast identisch mit dem "normalen" Windows-datei öffnen Dialog aus, deshalb habe ich es auch mal mit Notepad probiert, und stoße dort auf das gleiche Problem.
Das makro hatte ich mir schon vor längerem aus dem Inet gezogen, und habe leider keine Quellenangabe mehr - ist aber gottseidank auch nicht für eine Doktorarbeit :-) ).
In der Sendkeys variante des Makros passiert irgendwie gar nix, in der Sendmessage variante, spreche ich zwar ofensichtlich das richtige Fenster an, ich äandere aber nur den Fenstertitel und nicht den Inhalt.
Weiter Erläuterungen und die Makros findet Ihr in der angehängten Datei: https://www.herber.de/bbs/user/73648.xls
Vielen Dank für Eure Mithilfe
Gruss
Theo

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Probleme mit Sendmessage
21.02.2011 17:03:49
Nepumuk
Hallo,
ohne das entsprechende Fenster auf meinem Rechner musst du dir selber helfen.
1. Du benötigst das Handle des Fensters.
2. Du benötigst den Klassennamen des Eingabefeldes.
Also mit FindWindow das Fenster suchen. Dann mit FindWindowEx die Controls im Fenster abklappern und das entsprechende Eingabefeld rausfischen. An diese Handle dann mit Sendmessage den Text schicken.
Hier mal ein Beispiel. Darin wird nach der Kennwortbox gesucht die aufgeht wenn eine schreib-lesegeschützte Excelmappe geöffnet wird. Darin nach der Textbox, dieser wird dann das Kennwort "Hallo" übergeben.
Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
    ByVal hWnd As Long, _
    ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" ( _
    ByVal hWnd As Long) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
    ByVal hWnd1 As Long, _
    ByVal hWnd2 As Long, _
    ByVal lpsz1 As String, _
    ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Integer, _
    ByVal lParam As Any) As Long

Private Const GC_PASSWORDBOX = "bosa_sdm_XL9"
Private Const GC_EDITBOX = "EDTBX"
Private Const GWL_STYLE = -&H10
Private Const WS_VISIBLE = &H10000000
Private Const WS_BORDER = &H800000
Private Const WM_SETTEXT = &HC


Public Sub Beispiel()
    
    Dim lngHwnd As Long
    Dim strText As String
    
    strText = "Hallo"
    
    lngHwnd = FindWindow(GC_PASSWORDBOX, "Kennwort")
    
    If lngHwnd <> 0 Then
        
        If (GetWindowLong(lngHwnd, GWL_STYLE) And (WS_VISIBLE Or WS_BORDER)) = _
            (WS_VISIBLE Or WS_BORDER) And GetWindowTextLength(lngHwnd) <> 0 Then
            
            lngHwnd = FindWindowEx(lngHwnd, ByVal 0&, GC_EDITBOX, vbNullString)
            
            If lngHwnd <> 0 Then SendMessage lngHwnd, WM_SETTEXT, 0&, ByVal lngHwnd
            
            Exit Sub
            
        End If
    End If
End Sub

Gruß
Nepumuk
Anzeige
Kleiner Fehler
21.02.2011 17:05:57
Nepumuk
Hallo,
SendMessage muss natürlich den Text senden, nicht das Handle:
If lngHwnd <> 0 Then SendMessage lngHwnd, WM_SETTEXT, 0&, ByVal strText

Gruß
Nepumuk
AW: Kleiner Fehler
22.02.2011 18:46:41
Fettertiger
Hi Nepomuk,
vielen Dank - aber das abklappern der Handles war mir dann letztendlich doch zu hoch. Gelöst habe ich es dann trotzdem auf umwegen - mittels AutoIT.
angepasst auf mein beispiel müsste das Makro dann so aussehen (ungetestet, ich habs direkt für meine Applikation gemacht):
Option Explicit
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 wHwnd As Long
Public Const SW_RESTORE = 10
Private wText As String
Dim AutoIt As New AutoItX3Lib.AutoItX3
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
Sub Enter_Fileame_Mat() '
Dim hWnd As Long
windowTitle = "open"
hWnd = FindWindowByCaption(LCase(windowTitle))
If hWnd = 0 Then
' MsgBox "Window could not be found '" & _
' windowTitle & "'", vbCritical, "Error"
Else
Call BringWindowToTop(hWnd): _
Call ShowWindow(hWnd, SW_RESTORE): _
Call AutoIt.Send("{ALTDOWN}n{ALTUP}")
Call BringWindowToTop(hWnd): _
Call ShowWindow(hWnd, SW_RESTORE): _
Call AutoIt.Send("{CTRLDOWN}v{CTRLUP}{ALTDOWN}s{ALTUP}")
Mat_Success = True
End If
End Sub Dazu muss man natürlich erst die AutoItX3.dll referenzieren.
Grüße
Theo
Anzeige
AW: Kleiner Fehler
22.02.2011 20:53:28
Nepumuk
Hallo,
Hauptsache es funtioniert zuverlässig. ;-)
Gruß
Nepumuk

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige