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

VBA Postmessage ignoriert Shift

Forumthread: VBA Postmessage ignoriert Shift

VBA Postmessage ignoriert Shift
27.01.2026 09:56:09
W.Stecher
Hallo zusammen,

ich möchte beim RDP-Verbindungsaufbau das Passwort in die Anmeldemaske "Windows-Sicherheit" per VPA eintragen.
Die Ermittlung des Fensterhandles klappt wunderbar und Return zur Bestätigung der Eingabe funktioniert auch.
Ein Problem habe ich jedoch mit Großbuchstaben und Sonderzeichen.
Zu Testzwecken und um diesen Beitrag möglichst klein zu halten, wollte ich zunächst nur ein "T" eintragen, was jedoch eingetragen wird ist "tt"
Also weder ein großes T und das kleine t sogar zweimal. Das ist mein Code:



Option Explicit

Private Declare PtrSafe 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 Declare PtrSafe Function SetForegroundWindow Lib "user32" ( _
ByVal hwnd As Long) As Long

Private Declare PtrSafe Function SetActiveWindow Lib "user32.dll" ( _
ByVal hwnd As Long) As Long

Private Declare PtrSafe Sub Sleep Lib "kernel32" ( _
ByVal dwMilliseconds As LongPtr)



Public Function PostPassword()

Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101
Const VK_SHIFT = &H10

Dim hwnd As Long

Do Until hwnd > 0
hwnd = GetWindowHandle("Windows-Sicherheit")
Sleep 1000
Loop

Call SetForegroundWindow(hwnd)
Call SetActiveWindow(hwnd)

Sleep 500

'Shift Taste drücken
Call PostMessage(hwnd, WM_KEYDOWN, VK_SHIFT, &H1)

'T drücken
Call PostMessage(hwnd, WM_KEYDOWN, &H54, &H1)

'T loslassen
Call PostMessage(hwnd, WM_KEYUP, &H54, &H1)

'Shift Taste loslassen
Call PostMessage(hwnd, WM_KEYUP, VK_SHIFT, &H1)

End Function


Und das ist das Ergebnis:

Userbild

Hat jemand eine Idee, wo mein Denkfehler liegt?
Danke vorab.
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Postmessage ignoriert Shift
27.01.2026 10:55:13
volti
Hallo,

welcher Grund besteht, dass Du PostMessage verwendest.

Schon mal mit SendMessage versucht?

Bessere Wahl sollte m.E. aber keybd_event sein, welches die Tastenanschläge sendet. Oder hast Du das schon probiert und evtl. verworfen?

Gruß
Karl-Heinz
Du könntest dir auch...
27.01.2026 14:26:23
Case
Moin, :-)

... eine .rdp-Datei anlegen und dann: ;-)
Shell "mstsc ""C:\Temp\test.rdp""", vbNormalFocus

Oder per PowerShell mit "cmdkey". ;-)

Servus
Case
Anzeige
AW: Du könntest dir auch...
27.01.2026 14:51:05
W.Stecher
Hallo,

die RDP-Datei habe ich schon.
Doch selbst wenn ich das Passwort innerhalb der RDP-Datei speichere, sorgt eine interne Sicherheitsrichtlinie dafür, dass es abgefragt wird. Für das Starten von mehreren Windowssessions kurz vor Mitternacht etwas unpraktisch ;-)
OK - wenn die Richtlinie...
27.01.2026 15:13:59
Case
Moin, :-)

… bei PowerShell nicht greift, dann: ;-)

In PowerShell anlegen: ;-)
cmdkey /add:DERPC /user:DERUSER /pass:DASPASSWORT

Dann kannst du ausführen: ;-)
Shell "mstsc /v:DERPC", vbNormalFocus

Und wenn nicht mehr gebraucht - löschen: ;-)
cmdkey /delete:DERPC

Habe mich damit früher auch rumgeschalgen. Die ganzen API-Hacks haben aber immer nur bis zum nächsten Update geklappt. War also eine ständige Fummelei. ;-)

Servus
Case
Anzeige
AW: VBA Postmessage ignoriert Shift
27.01.2026 11:53:55
W.Stecher
Ich habe es anfänglich mit SendMessage probiert, jedoch damit gar nichts geschafft. Da SendMessage meines Erachtens abgesehen von der Nachrichten-Warteschlage und das Abwarten auf Rückmeldung identisch sind, habe ich es zunächst mit PostMassage probiert, bevor ich mich damit auseinander setze, warum SendMessage in meinem Fall nicht funktioniert hat, da ich leider kurzfristig eine funktionierende Lösung benötige.
Probiere ich es mit unten stehendem Code mit SendMessage, erscheint kein einziges Zeichen im Eingabefeld, noch nicht mal die "tt", die PostMessage produziert.




Option Explicit

Private Declare PtrSafe 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 Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr

Private Declare PtrSafe Function SetForegroundWindow Lib "user32" ( _
ByVal hwnd As Long) As Long

Private Declare PtrSafe Function SetActiveWindow Lib "user32.dll" ( _
ByVal hwnd As Long) As Long

Private Declare PtrSafe Sub Sleep Lib "kernel32" ( _
ByVal dwMilliseconds As LongPtr)



Public Function PostPassword()

Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101
Const VK_SHIFT = &H10

Dim hwnd As Long

Do Until hwnd > 0
hwnd = GetWindowHandle("Windows-Sicherheit")
Sleep 1000
Loop

Call SetForegroundWindow(hwnd)
Call SetActiveWindow(hwnd)

Sleep 500

'Shift Taste drücken
'Call PostMessage(hwnd, WM_KEYDOWN, VK_SHIFT, &H1)

'T drücken
'Call PostMessage(hwnd, WM_KEYDOWN, &H54, &H1)

'T loslassen
'Call PostMessage(hwnd, WM_KEYUP, &H54, &H1)

'Shift Taste loslassen
'Call PostMessage(hwnd, WM_KEYUP, VK_SHIFT, &H1)

'Shift drücken, T drücken, T loslassen, Shift loslassen
Call SendMessage(hwnd, WM_KEYDOWN, VK_SHIFT, &H1)
Call SendMessage(hwnd, WM_KEYDOWN, &H54, &H1)
Call SendMessage(hwnd, WM_KEYUP, &H54, &H1)
Call SendMessage(hwnd, WM_KEYUP, VK_SHIFT, &H1)

End Function
Anzeige
AW: VBA Postmessage ignoriert Shift
27.01.2026 14:01:40
volti
Hallo,

habe leider noch keine Lösung Deines Problems, aber Postmessage wäre wohl doch richtig.
Allerdings werden die WM-KEY-Messages meist eher in den Anwendungsschleifen zum Abfangen der Tastenaktionen verwendet.

Wie ich gelesen habe, gibt es beim Senden der normalen Zeichen wohl Probleme mit WM_KEY und es wird hier die Verwendung von WM_CHAR empfohlen.

Der letzte Parameter in der PostMessage-Funktion für WM_KEYDOWN ist die Anzahl, möglicherweise beginnt dieser bei 0. Weiß ich aber nicht.

Die Alternative SendKeys bzw. keybd_event hatte ich schon angesprochen, ist aber m.E. nicht so empfehlenswert.

Ich würde ohnehin den Text per SetWindowtext direkt in das Eingabefeld setzen. Die sicherste Methode. Dazu benötigt man allerdings die ID des TEingabefeldes. Zum Ermitteln ist ein Spy-Programm von Nutzen. Bei Bedarf habe ich einen Link.

Übrigens: Die PostMessage und die hWnd-Declares bei den anderen Declares und in der Sub sind teilweise falsch, sie müssen LongPtr sein.

Und man kann nicht nachvollziehen, wie Du das Handle in GetWindowHandle("Windows-Sicherheit") ermittelst.

Gruß KH
Anzeige
AW: VBA Postmessage ignoriert Shift
27.01.2026 15:00:37
W.Stecher
Da die Funktion zur Ermittlung des Fensterhandles schon älter ist und einwandfrei klappt, hatte ich sie nicht gepostet, um den Beitrag nicht unnötig lang werden zu lassen.
Dass der gesuchte Titel nur Teil des Fenstertitels sein muss, ist beabsichtigt. Dass das Handle richtig sein muss, zeigt aber schon der Umstand, dass die Buchstaben dort landen, wo sie hinsollen.




Public Function GetWindowHandle(sWindowTitle As String) As Long

Dim hwnd As Long
Dim bFound As Boolean
Dim sTitel As String

bFound = False

hwnd = GetWindow(GetDesktopWindow, GW_CHILD)

Do

sTitel = GetWindowInfo(hwnd)

If InStr(1, sTitel, sWindowTitle, vbTextCompare) > 0 Then
bFound = True
Exit Do
End If

hwnd = GetWindow(hwnd, GW_HWNDNEXT)

Loop Until hwnd = 0

If bFound = True Then
GetWindowHandle = hwnd
Else
GetWindowHandle = 0
End If

End Function




Ich habe auch noch ausprobiert, sowohl über Postmessage als auch über SendMessage, die Feststelltaste zu aktivieren bzw. die Num-Lock-Taste, da beide ja eine LED auf der Tatstatur haben und ein Erfolg damit sichtbar wäre. Beides funktioniert bei beiden Tasten nicht, was mich immer mehr zur Überzeugung bringt, dass das Problem vor dem Monitor sitzt, ich finde es trotzdem nicht.
Für einen Link zum Spy-Programm wäre ich sehr dankbar, dann würde ich mich mal an SetWindowtext probieren.
Danke vorab.
Anzeige
AW: VBA Postmessage ignoriert Shift
27.01.2026 16:07:15
volti
Hallo,

hier ein mögliches Spy-Programm.

https://www.clever-excel-forum.de/Thread-Windows-Spy-und-Pixelfarben

Kann es auch direkt hochladen, falls nötig.

Leider muss ich aber jetzt erst mal weg.

Falls Du den Weg gehen willst und nicht weiter kommst, kann ich auch mal probieren und/oder Tipps geben.
Leider weiß ich nicht, wie ich an das Dialogfenster komme, wie ich das simulieren kann. So kann ich nichts testen.

Gruß KH
Anzeige
AW: VBA Postmessage ignoriert Shift
27.01.2026 16:48:09
volti
Hallo,

hier noch eine (ungetestete) Version von zig anderen Ideen zum Setzen des Passworts in eine Dialogbox als Anregung.
Hierbei sind die IDs von Editbox und Button nicht bekannt. Es darf aber auch nur eine Editbox vorhanden sein.
Option Compare Text

Private Declare PtrSafe Function EnumChildWindows Lib "user32" ( _
ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, _
ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32" ( _
ByVal hWnd As LongPtr, ByVal wMsg As Long, _
ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Declare PtrSafe Function GetClassNameA Lib "user32" ( _
ByVal hWnd As LongPtr, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Dim msPasswort As String

Sub SetTextinControl()
Dim hDlg As LongPtr, hBtn As LongPtr

msPasswort = "MeinPasswort"

hDlg = GetWindowHandle

Call EnumChildWindows(hDlg, AddressOf EnumChildWindowProc, 0)
hBtn = FindWindowExA(hDlg, ByVal 0&, "Button", "OK")
If hBtn > 0 Then
Call SendMessageA(hBtn, &HF5, 0&, 0&) ' &HF5 = BM_CLICK
Call SendMessageA(hBtn, &HF5, 0&, 0&) ' &HF5 = BM_CLICK 2x erforderlich
End If
End Sub

Private Function EnumChildWindowProc(ByVal hWnd As LongPtr, lParam As LongPtr) As Long
Dim sClass As String * 16

Call GetClassNameA(hWnd, sClass, 16) ' Klassennamen holen
If sClass Like "EDIT*" Then
' Edittext updaten &HC = WM_SETTEXT
SendMessageA hWnd, &HC, 0, ByVal msPasswort: Exit Function
End If
EnumChildWindowProc = 1
End Function

Gruß KH
Anzeige
AW: VBA Postmessage ignoriert Shift
29.01.2026 13:47:57
W.Stecher
Hallo Volti,

vielen lieben Dank für den Vorschlag, ich werde ihn die nächsten Tage ausprobieren und berichten.

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige