Hotkey einstellen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Hotkey einstellen

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Hotkey einstellen

Beitrag von georg »

Hallo, Jan -


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.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Hotkey einstellen

Beitrag von Jan »

Georg,

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.
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

Zum Beispiel mit der SendInput funktion aus der User32.dll von Windows.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Hotkey einstellen

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Hotkey einstellen

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Hotkey einstellen

Beitrag von AUGE_OHR »

hi,
ramses hat geschrieben: Mi, 28. Apr 2021 12:08 Zum Beispiel mit der SendInput funktion aus der User32.dll von Windows.
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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Hotkey einstellen

Beitrag von AUGE_OHR »

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
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

AUGE_OHR hat geschrieben: Fr, 30. Apr 2021 5:20 und woher "weiss" die "andere" App von dem "Input" :?:
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
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

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"


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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Hotkey einstellen

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten