Tastenanschläge an Programm schicken

Hallo,

Wie kann ich ein [Ctrl]+[F1] an ein Programm schicken?
Geht dass nur an aktive Fenster?
Angenommen ich habe ein Handle, wie mache ich das dann?

Grüße
Fabian

Hallo, Fabian!

Wie kann ich ein [Ctrl]+[F1] an ein Programm schicken?
Geht dass nur an aktive Fenster?
Angenommen ich habe ein Handle, wie mache ich das dann?

Mit dem Handle ist das schon mal sehr gut, weil viel besser und sicherer als SendKeys. Schau mal in der API unter SendMessage nach. Hier noch ein ggf. nützlicher Link: http://www.activevb.de/rubriken/apikatalog/byname/by… , z. B. Tip 0599.

Gruß, Manfred

Mit dem Handle ist das schon mal sehr gut, weil viel besser
und sicherer als SendKeys. Schau mal in der API unter
SendMessage nach. Hier noch ein ggf. nützlicher Link:
http://www.activevb.de/rubriken/apikatalog/byname/by… ,
z. B. Tip 0599.

Das Problem ist nur, dass ich schon alles versucht hab mit den Handles, aber das nicht wirklich gut hinbekommen. Weil der Tastendruck von einem Unterhandle abgefangen wird.
Gibt es denn keine Möglichkeit Windows zu simulieren, dass ich ein bestimmtes Fenster auswählen und meine Kombination eingebe, ohne mich um Unterhandle usw. kümmern zu müssen.

Grüße
Fabian

Hallo, Fabian!

Das Problem ist nur, dass ich schon alles versucht hab mit den
Handles, aber das nicht wirklich gut hinbekommen. Weil der
Tastendruck von einem Unterhandle abgefangen wird.
Gibt es denn keine Möglichkeit Windows zu simulieren, dass ich
ein bestimmtes Fenster auswählen und meine Kombination
eingebe, ohne mich um Unterhandle usw. kümmern zu müssen.

Igitt. Ist das reproduzierbar, welches Unterhandle (Dies dürfte wahrscheinlich ein Textfeld oder eine Schaltfläche oder so was sein, was gerade den Fokuks hat.) die Bearbeitung übernimmt? Falls nicht, würde ich es doch mit SendKeys versuchen. Da Du aber das Handle hast, würde ich das in jedem Fall weiter verwenden (weil AppActivate irgendwie auch nicht wirklich zuverlässig ist) und das Fenster mit SetForegroundWindow/BrongWindowToTop (Tip 0214) aktivieren. Dann das SendKeys absetzen. Funktioniert das?

Gruß, Manfred

Igitt. Ist das reproduzierbar, welches Unterhandle (Dies
dürfte wahrscheinlich ein Textfeld oder eine Schaltfläche oder
so was sein, was gerade den Fokuks hat.) die Bearbeitung
übernimmt?

Das schon, aber ich habe es noch nicht geschafft eine richtige Kombination hinzuschicken. Ich glaube es liegt am lparam Wert von Sendmessage, kennst du dich damit aus?

Falls nicht, würde ich es doch mit SendKeys
versuchen. Da Du aber das Handle hast, würde ich das in jedem
Fall weiter verwenden (weil AppActivate irgendwie auch nicht
wirklich zuverlässig ist)

*g* das hab ich auch schon rausgefunden

und das Fenster mit
SetForegroundWindow/BrongWindowToTop (Tip 0214) aktivieren.
Dann das SendKeys absetzen. Funktioniert das?

Ja

Danke Fabian

Sendkey über API
Hallo Fabian,

ich hab vor einiger Zeit mal eine Alternative zu SendKey gefunden. Diese API sendet die Tastenkombination generell an Windows, d.h. es hat die gleiche Funktion als würdest du an der Tastatur in genau diesem Moment die Tasten drücken. Ein Vorteil ist, das diese API zuverlässiger scheint und du selber bestimmen kannst, wann welche Taste gedrückt und losgelassen wird. Ich hab das Beispiel mal für Ctrl+F1 angepasst:

Const KEYEVENTF_KEYUP = &H2
Const INPUT_MOUSE = 0
Const INPUT_KEYBOARD = 1
Const INPUT_HARDWARE = 2
Private Type MOUSEINPUT
dx As Long
dy As Long
mouseData As Long
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type HARDWAREINPUT
uMsg As Long
wParamL As Integer
wParamH As Integer
End Type
Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Private Declare Function SendInput Lib „user32.dll“ (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib „kernel32“ Alias „RtlMoveMemory“ (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Sub SendKeyCtrlF1()
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
'Ctrl
KInput.wVk = 162 'the key we’re going to press
KInput.dwFlags = 0 'press the key
'copy the structure into the input array’s buffer.
GInput(0).dwType = INPUT_KEYBOARD ’ keyboard input
CopyMemory GInput(0).xi(0), KInput, Len(KInput)

'F1
KInput.wVk = 112 'the key we’re going to press
KInput.dwFlags = 0 'press the key
'copy the structure into the input array’s buffer.
GInput(0).dwType = INPUT_KEYBOARD ’ keyboard input
CopyMemory GInput(0).xi(0), KInput, Len(KInput)

'do the same as above, but for releasing the key
KInput.wVk = 112 ’ the key we’re going to realease
KInput.dwFlags = KEYEVENTF_KEYUP ’ release the key
GInput(1).dwType = INPUT_KEYBOARD ’ keyboard input
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'send the input now
Call SendInput(2, GInput(0), Len(GInput(0)))

'do the same as above, but for releasing the key
KInput.wVk = 162 ’ the key we’re going to realease
KInput.dwFlags = KEYEVENTF_KEYUP ’ release the key
GInput(1).dwType = INPUT_KEYBOARD ’ keyboard input
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'send the input now
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub

Danke mal dafür.
Verwende jetzt aber doch ein Kombination aus „Activate Window“ (eine Funktion von der von dir empfohlenen Seite) und SendKeys. Funktioniert bis jetzt ganz gut.

Fabian