Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: String+TAB an inaktives Windowsfenster senden

VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 08:37:52
Melanie
Hallo allerseits,
ich moechte aus Excel heraus mit VBA code einen String (z.b "Hallo") + TAB (oder ENTER) an ein 'fremdes' WindowsapplicationFenster schicken (keine Officeanwendung), wobei das Fensterhandle (oder auch das entsprechende TextFeldHandle bekannt sind).
Allerdings soll dieses Fenster zum Senden nicht in den Fokus kommen, damit der normale User nicht bei seinen manuellen Eingaben in anderen Applicationen gestoert wird.
Bin noch recht neu in dieser Materie, wuerde mich aber ueber Euere Expertenmeinung und Vorschlaege freuen.
Gruss
Melanie W

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 11:20:26
Nepumuk
Hallo Melanie,
im Prinzip so:
Option Explicit

Private Declare Function SendMessageW Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As String) As Long
Private Declare Function SendMessageN Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Const WM_SETTEXT = &HC
Private Const WM_CHAR = &H102

Public Sub Beispiel()
    Dim hWnd As Long
    ' hwnd=Das Handle des Box
    Call SendMessageW(hWnd, WM_SETTEXT, 0&, "Hallo")
    Call SendMessageN(hWnd, WM_CHAR, 13&, 0&)
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 11:58:47
Melanie
Hallo nepomuk !
danke fuer die Antwort, habe es getestet und das Senden des Strings funktioniert schon mal richtig. Super ! :-)
Allerdings bewirkt das Senden von ENTER (wert 13) bei der Applikation nicht das 'Uebernehmen' der Aenderung des Stringwerts.
Ich habe ein bisschen rumprobiert und es scheint so, als wenn nach dem Senden des Strings die Applikation schon auf das naechste EingabeTextHandle springt und dort erst ENTER ausfuehrt ?!? Komisch.
Kann man vielleicht mit Shift+TAB wieder ein TextHandle 'zurueckspringen' und dann ENTER senden ?
Gruss
Melanie W
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 12:43:54
Nepumuk
Hallo Melanie,
das Handle ist eindeutig. Das Kommando wird schon an das richtige Fenster geschickt. Es kann aber sein, dass es von diesem nicht richtig interpertiert wird (ist abhängig vom Control). Da müssen wir mal verschiedene Varianten testen. Versuch es mal so:
Option Explicit

Private Declare Function SendMessageW Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As String) As Long
Private Declare Function SendMessageN Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Const WM_SETTEXT = &HC
Private Const BM_CLICK = &HF5

Public Sub Beispiel()
    Dim hWnd As Long
    ' hwnd=Das Handle des Box
    Call SendMessageW(hWnd, WM_SETTEXT, 0&, "Hallo")
    Call SendMessageN(hWnd, BM_CLICK, 0&, 0&)
End Sub

Achja, dir ist aber schon klar, dass die Handles dynamisch vergeben werden. Also jedes mal, wenn du das Programm öffnest, hat es mit fast 100% Sicherheit ein anderes.
Gruß
Nepumuk
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 13:14:35
Melanie
Hallo Nepumuk,
das BM_Click hat irgendwie keine Wirkung ... waehrend ja der vorherige Ansatz mit dem WM_CHAR, 13 immerhin in dem uebernaechsten TextFeld den Cursor blinken liess, sodass ich dachte, das ENTER wirkt auf das Textfeld, welches dem eigentlichen Ziel fuer String folgt.
Uebrigens kann man wohl bei der 'fremden' Applikation den neuen String mit Enter oder TAB 'uebernehmen' (uebernimmt diesen dann u.a in den FensterTitel).
Das mit den dynamischen Handles weiss ich, bisher habe ich diesen immer manuell ueber ein Tool bestimmt .. es gibt wohl dafuer auch Automatismen, aber solange das mit dem neuen String + Uebernahme in die inaktive Applikation nicht funktioniert, brauche ich gar nicht an 'Komfort' zu denken. ;-)
Gruss
Melanie
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 13:30:00
Nepumuk
Hallo Melanie,
dann versuch mal die erste Variante, aber so geändert:
Call SendMessageN(hWnd, WM_CHAR, 13&, 1835009)
Gruß
Nepumuk
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 16:14:00
Melanie
Hallo Nepumuk,
das hat leider die gleiche Wirkung wie WM_CHAR, 13&, 0&). Der Cursor blinkt nun im uebernaechsten TextFeld. ( Wo kommt eigentlich diese ominoese Zahl 1835009 als Parameter her ?)
Vielleicht hilft es, wenn ich beschreibe, wie ich die Zielapplikation normalerweise manuell bediene:
Man gibt in das ZielTextFeld (eines von vielen in der Applikation) diesen String ein und drueckt TAB oder ENTER, daraufhin sucht die Applikation wohl in einer Datenbank und erzeugt die Inhalte des Fensters (auch der Inhalt des angesprochenen Zieltextfeld wird dann durch eine entsprechende Referenznummer ersetzt).
Ich habe mal versucht nach Eingeben des Strings ins ZielFeld durch tastendruck (cursor oder wer-weiss-was) in andere TextFelder zu kommen. Das gelingt mir nur durch TAB oder ENTER, was aber automatisch dazu fuehrt, dass die kompletten Inhalte des Fensters entsprechend dem Datensatz erneuert werden ..
also das Verhalten, was ich nun durch den VBA code erreiche, kann ich irgendwie per Tastendruck gar nicht erzielen .. komisch.
Gruss
Melanie
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
09.12.2008 16:59:00
Nepumuk
Hallo Melanie,
1835009 ist ein Parameter um Nachrichten an nicht sichtbare Fenster zu senden.
nächster Versuch mit einer anderen Funktion. Wenn ich das Programm auf meinem Rechner hätte wär's einfacher, denn so langsam gehen mir die Ideen aus :-(
Option Explicit

Private Declare Function SendMessageW Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As String) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Const WM_SETTEXT = &HC
Private Const BM_CLICK = &HF5

Public Sub Beispiel()
    Dim hwnd As Long
    ' hwnd=Das Handle des Box
    Call SendMessageW(hwnd, WM_SETTEXT, 0&, "Hallo")
    Call PostMessage(hwnd, BM_CLICK, 0&, 0&)
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA: String+TAB an inaktives Windowsfenster senden
10.12.2008 10:09:45
Melanie
Hallo Nepumuk,
PostMessage , BM_CLICK, 0&, 0& zeigt keine Wirkung,
aber mit
call PostMessage( WM_KEYDOWN, VK_TAB, 0&)
habe ich jetzt einen weg gefunden, die fremde applikation zu ueberlisten ... ich habe festgestellt, dass nach 8 x tab senden, das urspruengliche textFeld wieder dran ist, und dann kann ich damit das 'Uebernehmen' des Strings hinbekommen.
Eleganter waere ein SHIFT+Tab senden (anstatt X mal TAB), um direkt 'rueckwaerts' zu springen.
Die Applikation kann ich leider nicht schicken, benutzt geschuetzten Tunnel, um auf Datenbank zuzugreifen.
Aber die Loesung des Hauptproblem scheint schon mal in Sicht ... VIELEN DANK fuer die Hilfe !!!!!
Gruss
Melanie
Anzeige

326 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige