Seite 1 von 2
Maustastendruck simulieren
Verfasst: 06.01.2006 17:43
von Spaceman
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
Verfasst: 06.01.2006 17:50
von Macros
Linke Maustaste gedrückt=
Code: Alles auswählen
GetCursorPos_(xy.point)
mouse_event_(#MOUSEEVENTF_LEFTDOWN, xy\x,xy\y,0,0)
GetAsyncKeyState_()
Verfasst: 06.01.2006 18:53
von AND51
Code: Alles auswählen
MyVariable = GetAsyncKeyState_(#VK_RBUTTON)
If MyVariable
;
; Rechte Maustate wurde gedrückt
; Hier dein Code
;
EndIf
Verlangt Zugriff auf API (d. h. keine Demoversion zum Kompilieren). Setze
#VK_LBUTTON ein, um die linke Maustaste abzufragen. Schau mal hier im FOrum, dort findest du einen Link zur MSDN, welche Konstante für welche Taste steht.
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
Verfasst: 06.01.2006 18:55
von Macros
z.B. Keylogger

Verfasst: 06.01.2006 18:56
von AND51
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...

Re: GetAsyncKeyState_()
Verfasst: 06.01.2006 18:57
von Spaceman
AND51 hat geschrieben:Dies funktioniert auch global, also auch, wenn dein Programm nicht den Fokus hat! Ideal für Hintergrundanwendungen.
MfG, AND51
Das klingt ja genial einfach! Gleich mal ausprobieren...
Verfasst: 06.01.2006 19:02
von Macros
Ich bin nicht Der,
@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)
Verfasst: 06.01.2006 19:17
von Spaceman
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.
Verfasst: 06.01.2006 19:36
von Spaceman
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...
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
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.
Verfasst: 06.01.2006 20:53
von AND51
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!!!
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
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!