Hotkey einstellen
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Hotkey einstellen
Moin,
gerade bin ich etwas am verzweifeln. Vielleicht hat da jemand eine Idee.
Das Programm ist zwar kompiliert mit /ga, aber die Oberfläche ist zeichenbasiert. Es gibt auch keine Haupt-Eventschleife, da es bis auf wenige Ausnahmen keine GUI-Elemente da drin gibt - die haben dann natürlich jeweils ihre eigene Event-Schleife.
Was ich jetzt machen muß: Ein Wert muß in die Zwischenablage geschrieben werden. Und dann muß ich einen Hotkey aufrufen, damit ein anderes Programm sich den Inhalt der Zwischenablage abholt und passend verarbeiten kann. Das alles soll der Benutzer nicht selber machen, sondern automatisch passieren, wenn der Benutzer die entsprechende Funktion aufruft.
Ansich klappt alles im Debugger: Der Wert ist korrekt in der Zwischenablage. PostAppEvent(nHotkey) gibt mir ein .T. zurück. Das folgende AppEvent() gibt mir den nHotkey ganz korrekt zurück. Also eigentlich alles ganz super. Nur das andere Programm bekommt nichts. Nur wenn ich dann wirklich in die Hardware greife und den Hotkey drücke, dann kommt da was an.
Wo ist da mein Denkfehler?
Jan
gerade bin ich etwas am verzweifeln. Vielleicht hat da jemand eine Idee.
Das Programm ist zwar kompiliert mit /ga, aber die Oberfläche ist zeichenbasiert. Es gibt auch keine Haupt-Eventschleife, da es bis auf wenige Ausnahmen keine GUI-Elemente da drin gibt - die haben dann natürlich jeweils ihre eigene Event-Schleife.
Was ich jetzt machen muß: Ein Wert muß in die Zwischenablage geschrieben werden. Und dann muß ich einen Hotkey aufrufen, damit ein anderes Programm sich den Inhalt der Zwischenablage abholt und passend verarbeiten kann. Das alles soll der Benutzer nicht selber machen, sondern automatisch passieren, wenn der Benutzer die entsprechende Funktion aufruft.
Ansich klappt alles im Debugger: Der Wert ist korrekt in der Zwischenablage. PostAppEvent(nHotkey) gibt mir ein .T. zurück. Das folgende AppEvent() gibt mir den nHotkey ganz korrekt zurück. Also eigentlich alles ganz super. Nur das andere Programm bekommt nichts. Nur wenn ich dann wirklich in die Hardware greife und den Hotkey drücke, dann kommt da was an.
Wo ist da mein Denkfehler?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2824
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 95 Mal
- Danksagung erhalten: 13 Mal
Re: Hotkey einstellen
Hallo, Jan -
liegt wohl daran, dass Du das Event innerhalb Deines Programms erzeugst, darum bekommt das andere Programm das nicht mit.
liegt wohl daran, dass Du das Event innerhalb Deines Programms erzeugst, darum bekommt das andere Programm das nicht mit.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Hotkey einstellen
Georg,
und wie bekomme ich den dann nach außen transportiert?
Jan
und wie bekomme ich den dann nach außen transportiert?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Hotkey einstellen
Hallo Carlo,
gute Idee. Da steh ich dann jetzt aber auf dem Schlauch wie ich das Array da übergeben kann. Alaska hat da zwar sein EXTERN mit dem letzten Update wieder erweitert, aber Arrays wie wir sie kennen gehen da halt (noch) nicht.
Jan
gute Idee. Da steh ich dann jetzt aber auf dem Schlauch wie ich das Array da übergeben kann. Alaska hat da zwar sein EXTERN mit dem letzten Update wieder erweitert, aber Arrays wie wir sie kennen gehen da halt (noch) nicht.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Hotkey einstellen
Hallo Jan
so wie ich mich errinnere benötigts du eine Struktur oder einfach einen entsprechend aufgebauten String und pro Taste 2 Aufrufe:
1. Taste drücken
2. Taste loslassen
Ich gehe es mal im Projekt suchen.
so wie ich mich errinnere benötigts du eine Struktur oder einfach einen entsprechend aufgebauten String und pro Taste 2 Aufrufe:
1. Taste drücken
2. Taste loslassen
Ich gehe es mal im Projekt suchen.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Hotkey einstellen
Carlo,
das wäre super!
Mir fällt gerade ein: Hatte Alaska nicht auch ein STRUCTURE eingebaut, mit dem Arrays passend umgebaut werden können?
Jan
das wäre super!
Mir fällt gerade ein: Hatte Alaska nicht auch ein STRUCTURE eingebaut, mit dem Arrays passend umgebaut werden können?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Hotkey einstellen
Hallo Jan
musste unvorhergesehen Arbeit für die nächsten Tage vorbereiten gehen und konnte den Code noch nicht suchen.
Hole das nach wenn ich zurück bin.
musste unvorhergesehen Arbeit für die nächsten Tage vorbereiten gehen und konnte den Code noch nicht suchen.
Hole das nach wenn ich zurück bin.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Hotkey einstellen
hi,
solange du kein Handle vom "Ziel" hast wird nichts dort an kommen.
und woher "weiss" die "andere" App von dem "Input"
solange du kein Handle vom "Ziel" hast wird nichts dort an kommen.
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Hotkey einstellen
hier ein Beispiel für SendInput. Es ist mit Ot4xb
Code: Alles auswählen
#include "ot4xb.ch"
//-----------------------------------------------------------------------------------------------------------------------
#define INPUT_MOUSE 0
#define INPUT_KEYBOARD 1
#define INPUT_HARDWARE 2
// ---------------------------------------------------------------------------
function Main()
local oInput := Input():New()
local nEvents := 4
local nSize := oInput:_sizeof_()
local pBuffer := _xgrab( nSize * nEvents )
local n , nn
// MOVING THE MOUSE
for nn := 1 to 1
oInput:_link_( pBuffer , .F.)
oInput:type := INPUT_MOUSE
oInput:mi:dwFlags := nOr( 0x8000 , 0x0001 ) // ( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE )
@user32:SendInput(1 , pBuffer , nSize)
for n := 1 to 50
oInput:_zeromemory_()
oInput:type := INPUT_MOUSE
oInput:mi:dx := 5
oInput:mi:dy := 5
oInput:mi:dwFlags := 0x0001 // MOUSEEVENTF_MOVE
@user32:SendInput( 1, pBuffer , nSize)
Sleep( 10 )
next
next
// SENDING KEYSTROKES
oInput:_zeromemory_()
oInput:type := INPUT_KEYBOARD
oInput:ki:wVk := 0x5B // VK_LWIN
GwstArrayNext(oInput)
oInput:type := INPUT_KEYBOARD
oInput:ki:wVk := 0x5B // VK_LWIN
oInput:ki:dwFlags := 0x0002 // KEYEVENTF_KEYUP
GwstArrayNext(oInput)
oInput:type := INPUT_KEYBOARD
oInput:ki:wVk := 27 // Esc.
GwstArrayNext(oInput)
oInput:type := INPUT_KEYBOARD
oInput:ki:wVk := 27 // Esc.
oInput:ki:dwFlags := 0x0002 // KEYEVENTF_KEYUP
for n := 1 to 20
@user32:SendInput( nEvents, pBuffer , nSize)
Sleep( 30 )
next
oInput:_unlink_()
_xfree( pBuffer)
return NIL
//-------------------------------------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------
BEGIN STRUCTURE INPUT
MEMBER DWORD type
BEGIN UNION
MEMBER @MOUSEINPUT mi
MEMBER @KEYBDINPUT ki
MEMBER @HARDWAREINPUT hi
END UNION
END STRUCTURE // 28 // BYTES
// ---------------------------------------------------------------------------
BEGIN STRUCTURE MOUSEINPUT
MEMBER LONG dx
MEMBER LONG dy
MEMBER DWORD mouseData
MEMBER DWORD dwFlags
MEMBER DWORD time
MEMBER DWORD dwExtraInfo
END STRUCTURE // 24 BYTES
//-----------------------------------------------------------------------------------------------------------------------
BEGIN STRUCTURE KEYBDINPUT
MEMBER WORD wVk
MEMBER WORD wScan
MEMBER DWORD dwFlags
MEMBER DWORD time
MEMBER DWORD dwExtraInfo
END STRUCTURE // 16
//-----------------------------------------------------------------------------------------------------------------------
BEGIN STRUCTURE HARDWAREINPUT
MEMBER DWORD uMsg
MEMBER WORD wParamL
MEMBER WORD wParamH
END STRUCTURE // 8
//-----------------------------------------------------------------------------------------------------------------------
gruss by OHR
Jimmy
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Hotkey einstellen
Genau. Es war mir dass da noch was fehlt.
Die Ziel-App muss zuerst irgendwie den Focus erhalten!
Ist mir heute Nacht bein nachdenken in Regensburg eingefallen.
Leider habe ich den Code nicht mehr.
Es was damals eine Auftragsarbeit die ich anschliessend vollständig abgegeben habe.
Nur andere Funktion zum suchen des Prozess-Handels anhand des EXE Namens habe ich noch. (mit ot4xb)
Valar Morghulis
Gruss Carlo
Gruss Carlo
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Hotkey einstellen
Hallo
ich habe doch noch was in den Unterlagen gefunden wie die Lösung damals war.
Der Beispiel Code sucht ein Fenster mit dem Titel "*new 1 - Notepad++" und sendet an dieses "F5 testT"
ich habe doch noch was in den Unterlagen gefunden wie die Lösung damals war.
Der Beispiel Code sucht ein Fenster mit dem Titel "*new 1 - Notepad++" und sendet an dieses "F5 testT"
Code: Alles auswählen
// F5 t e s t
arr := { 0x74, 0x54, 0x45, 0x53, 0x54 } // zu sendende Keystrokes
nHwHnd := FindWindow(nil, "*new 1 - Notepad++")
if nHwHnd = 0
msgbox("Benötigtes Programm ist nicht geladen")
else
SetForegroundWindow( nHwHnd )
SetActiveWindow( nHwHnd )
//
for i = 1 to len(arr)
u995sendArr2Keyboard( {arr[i]}, 0 )
sleep(5) // Kurz Warten, dem Ziel zeit zur abarbeitung geben
next
u995sendArr2Keyboard( {0x10} , 1 ) // Shift drücken
u995sendArr2Keyboard( {0x54} , 0 ) // T senden
u995sendArr2Keyboard( {0x10} , 2 ) // Shift loslassen
endif
// --- Keycodes siehe unter
// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
//
//
function u995sendArr2Keyboard( aMSKeyCodes, nWie ) // array mit Virt-Keycodes // nwie --> 0 = drücken und loslassen, 1 = nur drücken, 2 = nur Loslassen
local oInput := Input():New()
local i, nEvents, pBuffer
local nSize := oInput:_sizeof_()
nEvents := len( aMSKeyCodes )
if nWie = 0
nEvents *= 2
endif
pBuffer := _xgrab( nSize * nEvents )
oInput:_link_( pBuffer , .F.)
oInput:_zeromemory_()
oInput:type := 1 // INPUT_KEYBOARD
for i = 1 to len(aMSKeyCodes)
if nwie = 0 .or. nWie = 1
oInput:ki:wVk := aMSKeyCodes[i]
oInput:ki:dwFlags := 0x0000 // KEYEVENTF_KEYDOWN
endif
if nWie = 0
GwstArrayNext(oInput)
endif
if nwie = 0 .or. nWie = 2
oInput:ki:wVk := aMSKeyCodes[i]
oInput:ki:dwFlags := 0x0002 // KEYEVENTF_KEYUP
endif
next
sendInput( nEvents, pBuffer , nSize)
oInput:_unlink_()
_xfree( pBuffer)
return(nil)
BEGIN STRUCTURE INPUT
MEMBER DWORD type
BEGIN UNION
MEMBER @MOUSEINPUT mi
MEMBER @KEYBDINPUT ki
MEMBER @HARDWAREINPUT hi
END UNION
END STRUCTURE
BEGIN STRUCTURE MOUSEINPUT
MEMBER LONG dx
MEMBER LONG dy
MEMBER DWORD mouseData
MEMBER DWORD dwFlags
MEMBER DWORD time
MEMBER DWORD dwExtraInfo
END STRUCTURE
BEGIN STRUCTURE KEYBDINPUT
MEMBER WORD wVk
MEMBER WORD wScan
MEMBER DWORD dwFlags
MEMBER DWORD time
MEMBER DWORD dwExtraInfo
END STRUCTURE
BEGIN STRUCTURE HARDWAREINPUT
MEMBER DWORD uMsg
MEMBER WORD wParamL
MEMBER WORD wParamH
END STRUCTURE
static DLLFUNCTION SetForegroundWindow( hWnd ) USING STDCALL FROM USER32.DLL
static DLLFunction SetActiveWindow(hwnd) USING STDCALL FROM USER32.DLL
static DLLFUNCTION FindWindow( cClass, cName) USING STDCALL FROM USER32.DLL
static DLLFUNCTION SendInput(nEvents, pBuffer , nSize ) USING STDCALL FROM USER32.DLL
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Hotkey einstellen
Hallo Carlo,
Danke für Deine intensiven Bemühungen. Heute komme ich da leider nicht zu, aber ich werde das in den kommenden Tagen mal durchtesten.
Jan
Danke für Deine intensiven Bemühungen. Heute komme ich da leider nicht zu, aber ich werde das in den kommenden Tagen mal durchtesten.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.