MakroRekorder via Maus- & KeybHook: MausRad ? [gelöst]

Für allgemeine Fragen zur Programmierung mit PureBasic.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

MakroRekorder via Maus- & KeybHook: MausRad ? [gelöst]

Beitrag von sibru »

Hallo PB-Freunde,

ich habe hier einen MakroRekorder geschrieben, der (Maus-)TastenDrücke in allen Fenstern "aufnehmen" und "abspielen" kann.
Nun möchte ich hier auch noch das MausRad (im MausHook?) erfassen und emulieren, finde aber nirgendwo nicht´s dazu...

Hat wer ´ne Idee ?

[edit] Problem gelöst: MakroRekorder nun mit MausRad-Unterstützung

(div. Funktionen ;<-- aus Platzgründen geREMt

Code: Alles auswählen

#Prg_Name = "MakroRekorder"   
#PB_Vers  = "4.20"            
#Prg_Vers = "18608a"          ;<-- set by PB_VersUpd Vers 11415a

;Dieses Prg dient dem Aufzeichnen von Tastatur- und Maus-Aktionen sowie dem
;"abspielen" derselben.
;Nach Aufzeichnungs-Start via SysTray-Menue werden alle Tastendrücke und dessen loslassen
;(=Aktionen) in einer Queue gesammelt, bei MausTasten incl. Position.
;Aufnahme-Ende ist erneutes Anklicken des SysTray-Menü´s
;Beim Abspielen werden die gespeicherten Aktionen (TastenDrücke) emuliert.

#Registry_NoUse = 1 ;Registry nicht benutzten, anstelle PreferenzFile (.INI) benutzen

EnableExplicit
Structure Keyboard_HookStrk
  vkCode.l
  scanCode.l
  flags.l
  time.l
  dwExtraInfo.l
EndStructure

Structure MSLLHOOKSTRUCT
  StructureUnion
  pt.POINT
  ptVal.q
  EndStructureUnion
  mouseData.l
  flags.l
  time.l
  *dwExtraInfo
EndStructure

Global Makro$, MakroCnt  ;aufgezeichnete Aktionen: Aktions-Queue und Anzahl
Global last_mSec         ;wg. ZeitMessung zwischen den Aktionen
Global OrgProg_Maus      ;Adresse der Orginal-MausProcedure
Global OrgProg_Keyb      ;Adresse der Orginal-TastaturProcedure
Global SysTrayNr         ;Fenster-#Nr des (gehideten) SysTray-Fensters
Global RefStd$, IconStd  ;ToolTip-Text und IconNr für´s SysTray (Standart: weder Aufzeichnung noch abspielen)
Global MakroExit         ;Flag: #true, wenn MausZeiger während Aufnahme auf´s SysTray-Icon bewegt wird
Global NewList Makros$() ;Liste aller definierten Makro´s
Global Makros$           ;Namen aller Makros in Makros$() (für´s Auswahl-Menü: "welches Macro abspielen ?")

XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\Base64Str2Image.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\SysTrayEntry.PBI"

Procedure StrWert(*String)          ;- liefert nummerischen Wert am Anfang vom String und verkürzt Lezteren entsprechend
  Protected String$, Wert$
  If * String>1
    String$ = LTrim(PeekS(*String))
    While FindString("0123456789", Left(String$, 1), 1)
      Wert$ + Left(String$, 1)
      String$ = Mid(String$, 2)
    Wend
    PokeS(*String, LTrim(Right(String$, Len(String$) - 1)))
  EndIf
  ProcedureReturn Val(Wert$)
EndProcedure

Global Makro_Buff$ ;AufzeichnungsBuffer, enthälte letzte Aktion (kann Klick auf SysTray-Icon (=Aufzeichnunsg-Ende) sein: nicht abspeichern !!!
Procedure MakroRec(Aktion$)         ;- Maus- / Tasten-Aktion in Aufzeichnungs-Queue eintragen
  Debug "MakroRec(" + Aktion$ + ")"
  If Aktion$>""
    If last_mSec>0 : Aktion$ = "W" + Str(ElapsedMilliseconds() - last_mSec) + " " + Aktion$ : EndIf
    If Makro_Buff$>"" : Makro$ + Makro_Buff$ : MakroCnt + 1 : EndIf
    Makro_Buff$ = Aktion$ ;letzte Aktion buffern (wg. Klick auf SysTray-Icon zum Rec-Ende: Diesen _nicht_ speichern !
    last_mSec = ElapsedMilliseconds()
  EndIf
EndProcedure

#MOUSEEVENTF_WHEEL = $800
Procedure MakroPlay(Makro$)         ;- aufgezeichnete Maus-/Keyb-Aktionen "abspielen" (Tastendrücke emulieren)
      Protected res, scanCode, Typ, x, y
  Debug "MakroPlay(" + Makro$ + ")"
  While Trim(Makro$)>""
    Typ = Asc(Makro$): Makro$ = Mid(Makro$, 2)
    If Typ = 'W' : Delay(StrWert(@Makro$));Wait mSec´s
    ElseIf Typ = 'K'                       ;{Keyb-Aktion
      Typ = Asc(Makro$): Makro$ = Mid(Makro$, 2)
      scanCode = StrWert(@Makro$)
      If Typ = ' - ' :Typ = #KEYEVENTF_KEYUP ;simuliere #WM_KEYUP
      Else : Typ = 0                       ;simuliere #WM_KEYDOWN
      EndIf
      keybd_event_(scanCode, 0, Typ, 0);simuliere Taste
      ;}
    ElseIf Typ = 'M'                       ;{Maus-Aktion
      Typ = Asc(Makro$): Makro$ = Mid(Makro$, 2)
      x = StrWert(@Makro$)
      y = StrWert(@Makro$)
      res = SetCursorPos_(x, y);MausCursor positionieren
      If Typ = 'L' :Typ = #MOUSEEVENTF_LEFTDOWN       ;linke MausTaste drücken
      ElseIf Typ = 'l' :Typ = #MOUSEEVENTF_LEFTUP     ;linke MausTatse loslassen
      ElseIf Typ = 'R' :Typ = #MOUSEEVENTF_RIGHTDOWN  ;rechte MausTaste drücken
      ElseIf Typ = 'r' :Typ = #MOUSEEVENTF_RIGHTUP    ;rechte MausTatse loslassen
      ElseIf Typ = 'M' :Typ = #MOUSEEVENTF_MIDDLEDOWN ;mittlere MausTaste drücken
      ElseIf Typ = 'm' :Typ = #MOUSEEVENTF_MIDDLEUP   ;mittlere MausTatse loslassen
      ElseIf Typ = 'W' :Typ = #MOUSEEVENTF_WHEEL      ;RausRad rollen
        Protected rad=StrWert(@Makro$)
      Else : Typ = 0
      EndIf
      mouse_event_(Typ, 0, 0, rad, 0);Maus-Taste emulieren
      ;}
    EndIf
  Wend
EndProcedure

Macro KeybMakro(Mode)               ;- Aktion im Keyb-Hook zusammenbauen (Format "K"a s: a=Aktion (+=gedückt -=losgelassen) s=ScanCode der Taste
  "K" + Mode + Str(*p\vkCode) + " "
EndMacro

Procedure.l KeyboardHook(nCode, wParam, *p.Keyboard_HookStrk);- der Tastatur-Hook
  If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN
    Debug "Taste [" + Str(*p\vkCode) + "] gedrückt(ScanCode=" + Str(*p\scanCode) + ")"
    MakroRec(KeybMakro("+"))
  ElseIf wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
    Debug "Taste [" + Str(*p\vkCode) + "] losgelassen(ScanCode=" + Str(*p\scanCode) + ")"
    MakroRec(KeybMakro("-"))
  EndIf
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
EndProcedure

Macro MausMakro(Mode)               ;- Aktion in Maus-Hook zusammenbauen (Format "M"a x y: a=Aktion (#WM_?BUTTON???) x/y=MausPos
  "M" + Mode + Str(*p\pt\x) + " " + Str(*p\pt\y) + " "
EndMacro

Procedure MouseKeyHook(nCode, wParam, *p.MSLLHOOKSTRUCT);- der Maus-Hook
;  Debug "nCode="+Str(nCode)+"  wParam="+Str(wParam)+"  pos="+Str(*p\pt\x)+" / "+Str(*p\pt\y)
  Select wParam
    Case #WM_LBUTTONDOWN
      Debug "MausTaste+ links " + MausMakro("L")
      MakroRec(MausMakro("L"))
    Case #WM_LBUTTONUP ;Maus-Taste links loslassen
      Debug "MausTaste- links " + MausMakro("l")
      MakroRec(MausMakro("l"))
    Case #WM_RBUTTONDOWN ;Maus-Taste rechts
      Debug "MausTaste+ rechts " + MausMakro("R")
      MakroRec(MausMakro("R"))
    Case #WM_RBUTTONUP ;Maus-Taste rechts loslassen
      Debug "MausTaste- rechts " + MausMakro("r")
      MakroRec(MausMakro("r"))
    Case #WM_MBUTTONDOWN ;Maus-Taste mitte
      Debug "MausTaste+ mitte " + MausMakro("M")
      MakroRec(MausMakro("M"))
    Case #WM_MBUTTONUP
      Debug "MausTaste- mitte " + MausMakro("m")
      MakroRec(MausMakro("m"))
    Case #WM_MOUSEWHEEL ;MausRad
      Protected rad.w = ((*p\mouseData>>16)&$FFFF)
      Debug "MausRad "+Str(-(rad / 120))
      MakroRec(MausMakro("W")+Str(rad)+" ")
  EndSelect
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
EndProcedure

Procedure MakroRec_Exit()           ;- laufende Makro-Aufnahme beenden
  Protected Msg$, Name$
  UnhookWindowsHookEx_(OrgProg_Maus)
  UnhookWindowsHookEx_(OrgProg_Keyb)
  OrgProg_Keyb = 0 : OrgProg_Maus = 0
  If MakroCnt>0
    Msg$ = Str(MakroCnt) + " Aktionen speichern"
    Name$ = Trim(InputRequester(Msg$, "unter welchem Namen ?", ""))
    If Name$>""
      ; RegistryWrite("Makro", Name$, Makro$) ;<-- aus Platzgründen geREMt
      ; vorlesen("Makro " + Name$ + " gespeichert") ;<-- aus Platzgründen geREMt
      Makros$ + Chr(255) + Name$ + Chr(255)
      AddElement(Makros$())
      Makros$() = Makro$
    EndIf
  EndIf
  SysTrayNr = SysTrayEntry(RefStd$, Str(IconStd))
  Makro$ = "" : MakroCnt = 0 :last_mSec = 0 ;Reset Makro-Daten
  DisableMenuItem(1, 1, 0);"Makro aufnehmen" möglich
EndProcedure

;****************************************************************
;**                         MainSource                         **
;****************************************************************
DisableExplicit

; IniFile$ = #Prg_Name + ".INI" ;{erstmal alle bereitc definierten Makro´s aus INI-Datei einlesen --> Makros$() und Makros$
; If OpenPreferences(IniFile$)
  ; If PreferenceGroup("Makro")
    ; If ExaminePreferenceKeys()
      ; While NextPreferenceKey()
        ; AddElement(Makros$())
        ; Makros$() = PreferenceKeyValue()
        ; Makros$ + Chr(255) + PreferenceKeyName() + Chr(255) ;Queue der Makro-Namen, mit ^255 geklammert
      ; Wend
    ; EndIf
  ; EndIf
  ; ClosePreferences()
; EndIf;}

Icon$="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"
IconStd = Base64Str2Image(Icon$) ;SysTray-Icon Standart  (Base64Str2Image() ist toller Ersatz für CatchImage(#PB_Any, ?Label))
Icon$="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"
IconRec = Base64Str2Image(Icon$) ;SysTray-Icon Aufnahme
Icon$="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"
IconPlay = Base64Str2Image(Icon$);SysTray-Icon Abspielen

RefStd$ = "Makro-Rekorder" + #LF$ + "kann(Maus-)Tastendrücke" + #LF$ + "aufnehmen und abspielen"
RefRec$ = "nun aufzunehmende(Maus-)Tasten betätigen" + #LF$ + "Aufnahme-Ende: hier Maus-Klick"
RefPlay$ = "Makro wird abgespielt"
SysTrayNr = SysTrayEntry(RefStd$, Str(IconStd))
MenueID = CreatePopupMenu(1)
MenuItem(1, "Makro aufnehmen")
MenuItem(2, "Makro abspielen")
MenuItem(99, "Programm beenden")

;{- Fenster-Aufbau
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_SysTray ;{- SysTray-Aktion
      If EventType() = #PB_EventType_LeftClick Or EventType() = #PB_EventType_RightClick
        If OrgProg_Maus
          MakroRec_Exit()
        Else
          DisplayPopupMenu(1, SysTray_WinID)
        EndIf
      EndIf;
    Case #PB_Event_Menu       ;{- die FunktionsSteuerung
      Select EventMenu()
        Case 1 ;{Makro aufnehmen
          If OrgProg_Maus = 0 ;keine laufende Aufzeichnung
            SysTrayNr = SysTrayEntry(RefRec$, Str(IconRec));Aufnahme-Icon in´s SysTray
            ;- Tastatur-Hook eintragen
            Makro$ = "" : Makro_Buff$=""
            OrgProg_Maus = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseKeyHook(), GetModuleHandle_(0), 0)
            OrgProg_Keyb = SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyboardHook(), GetModuleHandle_(0), 0)
            DisableMenuItem(1, 1, 1);"Makro aufnehmen" ausgrauen
          EndIf ;}
        Case 2 ;{Makro abspielen
          If OrgProg_Maus = 0 ;keine laufende Aufzeichnung
            SysTrayNr = SysTrayEntry(RefPlay$, Str(IconPlay));Play-Icon in´s SysTray
            DisableMenuItem(1, 1, 1);"Makro aufnehmen" ausgrauen
            ;MakroNr = Auswahl_Fenster(0, 0, Makros$, "welches Makro abspielen ?") ;<-- aus Platzgründen geREMt
            MakroNr=1 
            If MakroNr
              SelectElement(Makros$(), MakroNr - 1)
              MakroPlay(Makros$())
            EndIf
            SysTrayNr = SysTrayEntry(RefStd$, Str(IconStd));Play-Icon in´s SysTray
            DisableMenuItem(1, 1, 0);"Makro aufnehmen" ausgrauen
            DisableMenuItem(1, 2, 0);"Makro abspielen" ausgrauen
          EndIf ;}
        Case 99 ;{PrgExit
          If OrgProg_Maus ;nicht keine laufende Aufzeichnung
            UnhookWindowsHookEx_(OrgProg_Maus)
            UnhookWindowsHookEx_(OrgProg_Keyb)
          EndIf
          End ;}
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
If OrgProg_Maus ;nicht keine laufende Aufzeichnung
  UnhookWindowsHookEx_(OrgProg_Maus)
  UnhookWindowsHookEx_(OrgProg_Keyb)
EndIf
End

Zuletzt geändert von sibru am 08.06.2018 12:23, insgesamt 1-mal geändert.
Bild Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Beitrag von RSBasic »

Im Callback kannst du mit #WM_MOUSEWHEEL und wParam die Mausradbenutzung ermitteln.
Beispielcode: https://www.rsbasic.de/aktualisierung/w ... mitteln.pb
Du kannst ja versuchen, den Code in deine Funktion einzubauen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Beitrag von NicTheQuick »

@RSBasic:
Er möchte es mit einem Mousehook machen und nicht per normalem WindowCallback, nehme ich an.
Im Übrigen ist die 120 in dem Code auch als Konstante #WHEEL_DELTA verfügbar. Die sollte man nutzen.

Mit dem Mousehook funktioniert das dann so. Man kann überall scrollen und sieht es im Debug-Fenster.

Code: Alles auswählen

Structure MSLLHOOKSTRUCT
	StructureUnion
		pt.POINT
		ptVal.q
	EndStructureUnion
	mouseData.l
	flags.l
	time.l
	*dwExtraInfo
EndStructure

Procedure.i MouseHook(nCode.l, wParam.l, *p.MSLLHOOKSTRUCT)
	If nCode = #HC_ACTION
		Select wParam
		
			Case #WM_MOUSEWHEEL
				Protected wheel.w = (*p\mouseData >> 16) / #WHEEL_DELTA
				Debug wheel
		EndSelect
	EndIf
	ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
EndProcedure

Define hookMouse.i = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseHook(), GetModuleHandle_(0), 0)

OpenWindow(0, 0, 0, 100, 100, "Mousehook")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Beitrag von Josh »

NicTheQuick hat geschrieben:Mit dem Mousehook funktioniert das dann so. Man kann überall scrollen und sieht es im Debug-Fenster.
Das funktioniert so nicht für alle Mäuse. Es gibt rasterlose Mäuse, die viel feinere Ergebnisse bringen als 120. In diesem Fall würde dein Code nicht funktionieren, da die 120 nur in zufälligen Situationen erreicht werden. Du musst die Ergebnisse aufsummieren und erst dann auswerten.

Code: Alles auswählen

Structure MSLLHOOKSTRUCT
  StructureUnion
    pt.POINT
    ptVal.q
  EndStructureUnion
  mouseData.l
  flags.l
  time.l
  *dwExtraInfo
EndStructure

Procedure.i MouseHook(nCode.l, wParam.l, *p.MSLLHOOKSTRUCT)
  Static WheelDelta

  If nCode = #HC_ACTION
    Select wParam

      Case #WM_MOUSEWHEEL
        WheelDelta + (*p\mouseData >> 16)
        While WheelDelta >= #WHEEL_DELTA
          Debug 1
          WheelDelta - #WHEEL_DELTA
        Wend
        While WheelDelta <= -#WHEEL_DELTA
          Debug -1
          WheelDelta + #WHEEL_DELTA
        Wend

    EndSelect
  EndIf

  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)

EndProcedure

Define hookMouse.i = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseHook(), GetModuleHandle_(0), 0)

OpenWindow(0, 0, 0, 100, 100, "Mousehook")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Habe leider keine entsprechende Maus mehr zum testen, sollte aber funktionieren.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Beitrag von NicTheQuick »

Da hast du absolut Recht. Und gerade wenn man Makros aufzeichnet, sollte man vielleicht auch gar nicht durch #WHEEL_DELTA teilen, sondern den rohen Wert hernehmen und wieder abspielen.
Bild
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: MakroRekorder via Maus- & KeybHook: MausRad ? [gelöst]

Beitrag von sibru »

Toll !!

Mit der Structure MSLLHOOKSTRUCT klappt´s wunderbar !
Und wie NicTheQuick vorgeschlagen, ignoriere ich #WHEEL_DELTA und schreibe *p\mouseData direkt in´s Makro

Danke !
Bild Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: MakroRekorder via Maus- & KeybHook: MausRad ? [gelöst]

Beitrag von Sicro »

Die Callback-Procedure muss bei globalen Hooks ("WH_KEYBOARD_LL" und "WH_MOUSE_LL" erzeugen einen) in einer DLL ausgelagert werden:
You must place a global hook procedure in a DLL separate from the application installing the hook procedure.
Quelle: https://msdn.microsoft.com/en-us/librar ... s.85).aspx

Es ist schon lange her, als ich ebenfalls so ein Programm gebastelt habe, aber ich glaube, als ich das ohne DLLs ausprobiert habe, funktionierte das Programm nicht immer zuverlässig.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: MakroRekorder via Maus- & KeybHook: MausRad ? [gelöst]

Beitrag von NicTheQuick »

Meins funktioniert ohne DLL wunderbar.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MakroRekorder via Maus- & KeybHook: MausRad ? [gelöst]

Beitrag von RSBasic »

@Sicro
Das habe ich nicht gewusst. Gut zu wissen. Danke
NicTheQuick hat geschrieben:Meins funktioniert ohne DLL wunderbar.
Mein Keyboard Editor zum Glück ebenfalls.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten