Maustastendruck simulieren
Maustastendruck simulieren
Mein Problem
Mein Neffe möchte es seinen großen Schwestern nachtun und mit Paintbrush malen. Leider hat er aber noch ein Problem damit, die linke Maustatse gedrückt zu halten und gleichzeitig koordinierte Bewegungen mit der Maus auszuführen. Nun dachte ich mir, dass ein kleines Programm ihm weiterhelfen könnte, das folgende Funktionalität besitzt:
Durch einen Klick auf die rechte Maustaste soll zwischen "linke Maustaste gedrückt/nicht gedrückt" getoggelt werden.
Optimal wäre es natürlich, wenn daraus eine Applikation erwächst, die ein Systray-Icon hat, welches ein Menü zur Auswahl der Programme bereitstellt, in denen diese Funktionalität erwünscht ist. Dann wäre ein allgemein verwendbares Programm daraus geworden.
Die quick'n'dirty Variante, in der die rechte Maustaste immer diese Funktionalität besitzt, bis die Anwendung beendet wird, ist aber für mich genauso gut.
Meine Fragen
Mir fehlen zur Realisierung erst mal die Ideen. Die Umsetzung bekäme ich vermutlich selber hin. Ich kann mir nichts anderes als einen Global Mouse Hook vorstellen, um den Druck der rechten Maustaste abzufangen und wie ich Paintbrush eine permanent gedrückte linke Maustaste vorgaukeln soll, weiß ich auch nicht. Hat da jemand Anregungen für mich?
Danke für eure Antworten, Robin
Mein Neffe möchte es seinen großen Schwestern nachtun und mit Paintbrush malen. Leider hat er aber noch ein Problem damit, die linke Maustatse gedrückt zu halten und gleichzeitig koordinierte Bewegungen mit der Maus auszuführen. Nun dachte ich mir, dass ein kleines Programm ihm weiterhelfen könnte, das folgende Funktionalität besitzt:
Durch einen Klick auf die rechte Maustaste soll zwischen "linke Maustaste gedrückt/nicht gedrückt" getoggelt werden.
Optimal wäre es natürlich, wenn daraus eine Applikation erwächst, die ein Systray-Icon hat, welches ein Menü zur Auswahl der Programme bereitstellt, in denen diese Funktionalität erwünscht ist. Dann wäre ein allgemein verwendbares Programm daraus geworden.
Die quick'n'dirty Variante, in der die rechte Maustaste immer diese Funktionalität besitzt, bis die Anwendung beendet wird, ist aber für mich genauso gut.
Meine Fragen
Mir fehlen zur Realisierung erst mal die Ideen. Die Umsetzung bekäme ich vermutlich selber hin. Ich kann mir nichts anderes als einen Global Mouse Hook vorstellen, um den Druck der rechten Maustaste abzufangen und wie ich Paintbrush eine permanent gedrückte linke Maustaste vorgaukeln soll, weiß ich auch nicht. Hat da jemand Anregungen für mich?
Danke für eure Antworten, Robin
Linke Maustaste gedrückt=
Code: Alles auswählen
GetCursorPos_(xy.point)
mouse_event_(#MOUSEEVENTF_LEFTDOWN, xy\x,xy\y,0,0)
GetAsyncKeyState_()
Code: Alles auswählen
MyVariable = GetAsyncKeyState_(#VK_RBUTTON)
If MyVariable
;
; Rechte Maustate wurde gedrückt
; Hier dein Code
;
EndIf
So viel schon jetzt:
Es gibt #VK_A — #VK_Z und für die Zahlen 0-9.
Dies funktioniert auch global, also auch, wenn dein Programm nicht den Fokus hat! Ideal für Hintergrundanwendungen.
MfG, AND51
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Ich wollts schon sagen, aber ich habs mir doch verkniffen. Hey du bist doch der, dem sie in einem anderen thread heir unterstellen, einen Keylogger zu bauen, richtig? Selbst wenn, sag doch einfach, dass sie dich lassen sollen, sie müssten den logger ja nicht öffnen... 

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Re: GetAsyncKeyState_()
Das klingt ja genial einfach! Gleich mal ausprobieren...AND51 hat geschrieben:Dies funktioniert auch global, also auch, wenn dein Programm nicht den Fokus hat! Ideal für Hintergrundanwendungen.
MfG, AND51
Ich bin nicht Der,
@Spaceman
weitere Keycodes (aus einem Programm von mir, daher die Form)
@Spaceman
weitere Keycodes (aus einem Programm von mir, daher die Form)
Code: Alles auswählen
AddKey("1", #VK_NUMPAD1)
AddKey("2", #VK_NUMPAD2)
AddKey("3", #VK_NUMPAD3)
AddKey("4", #VK_NUMPAD4)
AddKey("5", #VK_NUMPAD5)
AddKey("6", #VK_NUMPAD6)
AddKey("7", #VK_NUMPAD7)
AddKey("8", #VK_NUMPAD8)
AddKey("9", #VK_NUMPAD9)
AddKey("0", #VK_NUMPAD0 )
;Sonderzeichen
AddKey("*", #VK_MULTIPLY)
AddKey(" ", #VK_SPACE)
AddKey("+",#VK_ADD)
AddKey(",",188 )
AddKey("-",#VK_SUBTRACT)
AddKey("/",#VK_DIVIDE)
AddKey("{F1}",#VK_F1)
AddKey("{F2}",#VK_F2)
AddKey("{F3}",#VK_F3)
AddKey("{F4}",#VK_F4)
AddKey("{F5}",#VK_F5)
AddKey("{F6}",#VK_F6)
AddKey("{F7}",#VK_F7)
AddKey("{F8}",#VK_F8)
AddKey("{F9}",#VK_F9)
AddKey("{F10}",#VK_F10)
AddKey("{F11}",#VK_F11)
AddKey("{F12}",#VK_F12)
AddKey(".",190)
AddKey(":",446)
AddKey("#",191)
AddKey("ß",219)
Zuletzt geändert von Macros am 09.12.2007 15:05, insgesamt 1-mal geändert.
Danke, danke, danke! Aber jetzt bastel ich erst mal zusammen, was ich alles bekommen habe und die Codes benötige ich auch gar nicht.
Ich bau wohl noch eine Abfrage ein, ob Paintbrush das gerade aktive Programm ist und dann werde ich auch noch mal austesten, ob ich eine kleine Zeitabfrage einbauen muss, weil mein grobmotorischer Neffe die rechte Maustaste vielleicht gleich 2 oder 3x für ein paar Sekunden gedrückt hält...
Ich poste dann das Ergebnis, sobald ich damit zufrieden bin.
Ich bau wohl noch eine Abfrage ein, ob Paintbrush das gerade aktive Programm ist und dann werde ich auch noch mal austesten, ob ich eine kleine Zeitabfrage einbauen muss, weil mein grobmotorischer Neffe die rechte Maustaste vielleicht gleich 2 oder 3x für ein paar Sekunden gedrückt hält...

Ich poste dann das Ergebnis, sobald ich damit zufrieden bin.
Na das haut leider nicht so hin, wie ich das dachte...
Wenn ich einen Rechtsklick mache, dann dauert das eine ganze Weile, bis mir meine Messagebox angezeigt wird und das erhoffte Ergebnis bleibt auch aus...
Ich vermute, ich muss doch einen ganz brutalen Mousehook machen, der keine weiteren Hooks aufruft, wenn das aktive Programm Paintbrush ist. Ansonsten wird wohl immer wieder die Maustaste neu ausgelesen und die ist ja nun mal nicht gedrückt... 
Leider habe ich jetzt keine Zeit mehr daran herumzumachen.
Wenn ich einen Rechtsklick mache, dann dauert das eine ganze Weile, bis mir meine Messagebox angezeigt wird und das erhoffte Ergebnis bleibt auch aus...
Code: Alles auswählen
#MOUSEEVENTF_LEFTDOWN = $2
#MOUSEEVENTF_LEFTUP = $4
Procedure MouseEvent(Ereignis.l)
Mem.l=GlobalAlloc_(0,8)
GetCursorPos_(Mem)
mouse_event_(Ereignis|#MOUSEEVENTF_ABSOLUTE,PeekL(Mem)*($FFFF/GetSystemMetrics_(0)),PeekL(Mem+4)*($FFFF/GetSystemMetrics_(1)),0,GetMessageExtraInfo_())
GlobalFree_(Mem)
EndProcedure
If OpenWindow(0, 111, 111, 200, 100, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget , "Mausknopfsimulant")
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
MyVariable = GetAsyncKeyState_(#VK_RBUTTON)
If MyVariable ; rechte Maustaste wurde gedrückt
MouseEvent(#MOUSEEVENTF_LEFTDOWN)
MessageRequester("mks", "LeftDown")
EndIf
Until Quit = 1
EndIf
End

Leider habe ich jetzt keine Zeit mehr daran herumzumachen.
Was erhoffst du dir denn ür ein Ergebnis? Die Prozedur da oben ist mir (noch) zu hoch...
Ich optimiere übrigens mal den If MyVariable-Teil!!!
Mit der neuen, 2. Repeat Zeile wird das Programm an der Stelle solange angehalten, bis der Mausknopf wieder losgelassen wird. sonst würde eine MessageBox nach der anderen kommen, und es würde Sekunden dauern, bis PB erkennt, das die Maustaste losgelassen wird.
Hoffe, das hilft.
@ Problem: Vielleicht wird deine CPU zu stark ausgenutzt. Wirke dem entgegegen, indem du vor das Until Quit = 1 noch ein Delay(1) setzt! Dadurch geht der CPU verbraucht drastisch zurück!
Ich optimiere übrigens mal den If MyVariable-Teil!!!
Code: Alles auswählen
Repeat
MyVariable=GetAsyncKeyState_(#VK_RBUTTON)
If MyVariable
; Dein Code
; Rechte Taste ward gedrückt
MessageRequester("Hi", "Test")
EndIf
Repeat : Until GetAsyncKeyState_(#VK_RBUTTON) = 0
Until Quit = 1
Hoffe, das hilft.
@ Problem: Vielleicht wird deine CPU zu stark ausgenutzt. Wirke dem entgegegen, indem du vor das Until Quit = 1 noch ein Delay(1) setzt! Dadurch geht der CPU verbraucht drastisch zurück!
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End