Seite 1 von 2

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

Verfasst: 08.06.2018 01:31
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


Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Verfasst: 08.06.2018 08:40
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.

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Verfasst: 08.06.2018 10:15
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

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Verfasst: 08.06.2018 11:31
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.

Re: MakroRekorder via Maus- & KeybHook: MausRad ?

Verfasst: 08.06.2018 11:41
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.

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

Verfasst: 08.06.2018 12:16
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 !

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

Verfasst: 08.06.2018 19:12
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.

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

Verfasst: 08.06.2018 20:30
von NicTheQuick
Meins funktioniert ohne DLL wunderbar.

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

Verfasst: 08.06.2018 20:36
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.

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

Verfasst: 18.07.2024 12:25
von ChrigiGee
Hallo and den Themen Ersteller und alle anderen,

ich bin per Zufall auf diesen Eintrag gestossen, da ich eigentlich genau ein Projekt für mich am
überlegen war in diese Richtung.

Mein Problem, ich verstehe nicht, die beiden Include Dateien, welche der sibru angegeben hatte.
Sind diese als Bestandteil von PureBasic oder sind das selber erstellte?

Ich habe mir den Source genommen, um mich etwas der Thematik widmen zu können und ich bekomme immer
die Fehlermeldung, dass besagte PB Include Dateien fehlen.

Ich habe sehr viel wieder aus Basic vergessen, da es schon sehr lange her ist, dass ich mit VB etwas gemacht hatte.
Und um wieder in die Thematik etwas einarbeiten zu können, dachte ich, dass es gerade perfekt wäre.

Code: Alles auswählen

XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\Base64Str2Image.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\SysTrayEntry.PBI"
Ich wäre sehr dankbar für eine kurze Hilfestellung.

Herzliche Grüsse
Chris