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