Nicht deaktivieren, sondern die Windows-Taste der ergonomischen Sculpt-Maus zum Senden einer XBUTTON2-Nachricht veranlassen (winapi prespective)

2102
Noitidart

Wie erwartet, senden die zwei zusätzlichen Schaltflächen aller Mäuse XBUTTON1- und XBUTTON2-Nachrichten. Bei einer ergonomischen Sculpt-Maus sendet die Windows-Taste dies jedoch nicht. Anscheinend sendet es die richtige Windows-Taste. Ich muss es reparieren, damit es XBUTTON2 sendet.

Ich konnte die Windows-Taste mit den folgenden Schritten deaktivieren: Microsoft Sculpt Mobile Mouse neu starten (Windows-Taste) - dies deaktiviert jedoch die Windows-Taste der Maus vollständig und lässt sie nicht wie sonst bei allen fünf Tasten funktionieren Mäuse. Es sollte senden XBUTTON2.

Ich brauche es jedoch als XBUTTON2.

Hier ist eine detaillierte Erklärung:

Ich bin Softwareentwickler. Ich habe mir die ergonomische Maus von Sculpt gekauft, da sie fünf Tasten (und einen horizontalen Bildlauf) hat, so dass ich alle Tastenmeldungen testen kann. Es hilft vor allem, wenn ich mich während des Schreibens / der Maus wohlfühle.

Die Schaltflächenmeldungen sind hier für Maushaken zu sehen: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644986.aspx

Das Feld mouseData wird entsprechend der Maustaste festgelegt:

  • Durch Drücken der linken Maustaste wird die Nachricht gesendet: WM_LBUTTONDOWN
  • Rechte Maustaste: WM_RBUTTONDOWN
  • Mittlere Maustaste: WM_MBUTTONDOWN
  • Seitliche Maustaste: WM_XBUTTONDOWNund in der MSLLHOOKSTRUCT-Struktur sehen Sie: https://msdn.microsoft.com/de-de/library/windows/desktop/ms644970.aspx?f=255&MSPPError=-2147217396 - Das Feld mouseData istXBUTTON1
  • Jetzt das Problem - Windows-Maus sendet nichts - Ich erwarte, dass es eine Nachricht WM_XBUTTONDOWNmit mouseData von sendet XBUTTON2(beachten Sie die 2)

Hier ist eine Grafik, um die Aufzählungspunkte zu erklären:

Nicht deaktivieren, sondern die Windows-Taste der ergonomischen Sculpt-Maus zum Senden einer XBUTTON2-Nachricht veranlassen (winapi prespective)

Die grüne Pfeil- und Textwolke zeigt, wie es ist und was ich erwarte. Die rote Pfeil- und Textwolke ist, was ich erwarte, die Windows-Maustaste, aber das tut es nicht. Jeder kann mir dabei helfen, dass diese Windows-Maustaste vom Winapi-Standpunkt aus wie erwartet funktioniert?

1
Da dies wahrscheinlich auf der Hardwareebene geschieht, verwenden Sie als beste Methode (das Schreiben eines benutzerdefinierten Treibers) eine der Standardschlüssel-Neuzuordnungsmethoden, um die rechte Windows-Taste der gewünschten Maustaste zuzuordnen. Sie können das Remapping über die Registrierung (verfügbare Tools) oder ein Benutzermodusprogramm wie AHK durchführen - suchen Sie nach einer der vorhandenen Fragen. Bob vor 8 Jahren 1
Danke @Bob, ist der aktuelle Treiber Open Source? Vielleicht könnte ich es ändern? (Da ich ein anderes Problem habe, beim Neigen des Scroll-Rads nach rechts / links, anstatt ein Scroll-Event nach links / rechts zu senden, sendet es weiterhin geneigt - anders als beim Scrollen nach oben / unten ein Ereignis nach oben oder unten dir) Noitidart vor 8 Jahren 0
Auch @Bob wissen Sie, ob AutoHotkey per Registrierung neu abbildet? Ich möchte nicht etwas wie "X-Mouse Button Control (XMBC)" verwenden, da ein Maushaken nur installiert, abgefangen und ausgesendet wird, und es ist eigentlich keine Remap, es erkennt gar nicht, dass Im das trifft 5. Taste. Noitidart vor 8 Jahren 0
Danke @Bob Ich habe gerade Autohotkey verwendet, es scheint nur aktiv zu sein, während das Skript aktiv ist. Hört sich also nach einem Haken an. Gleiche Situation bei dem sich wiederholenden horizontalen Rad-Links / Rechts-Ereignis. Wenn ich `RWin` auf` XButton2` umgruppierte, sendete es wiederholt `XButton2`, während die Maustaste gedrückt war, sollte es nur einmal gesendet werden :(, muss ich vielleicht den benutzerdefinierten Treiber schreiben, oder? Noitidart vor 8 Jahren 0
Wenn die Maushardware die sich wiederholenden Signale aussendet, können Sie nicht viel dagegen tun. Vielleicht könnten Sie mit AHK etwas tun, das einen Knopf beim ersten Drücken nach unten und einen Knopf nach oben simuliert, wenn seit dem letzten Drücken X Sekunden vergangen sind, aber das ist bestenfalls hacky. Was XMBC angeht, so ist an einem Maushaken nichts auszusetzen, aber die "fünfte Taste" würde dort nicht funktionieren, da die Maus wahrscheinlich vorgibt, eine Tastatur zu sein. Wenn der Computer betroffen ist, haben Sie separate Maus- und Tastaturgeräte angeschlossen der gleiche USB-Port. Bob vor 8 Jahren 1
Vielen Dank @Bob für Ihre ausführliche Antwort. Ich verstehe Treiber nicht vollständig, aber würde ein benutzerdefinierter Treiber das Wiederholungsverhalten beherrschen? Noitidart vor 8 Jahren 0
Angenommen, die Wiederholungen werden auf der Hardwareseite implementiert (und nicht ein spezieller Treiber von MS selbst). Meistens unterscheidet es sich nicht von der Verwendung eines Userspace-Programms wie AHK, da die tatsächliche Methode, die Sie zum Erkennen der Wiederholungen verwenden, ähnlich ist. Nur in besonderen Situationen - wenn das Programm, mit dem Sie interagieren, auf einer niedrigeren Ebene ist als das, was AHK anlegt -, würden Sie einen Unterschied feststellen. Die meiste Zeit ist also viel Arbeit für wenig Gewinn. Bob vor 8 Jahren 1
Vielen Dank @Bob Ich werde versuchen, dieses Problem mit AHK zu lösen. Ich wünschte nur, Microsoft würde dies als Optionen in der Tastaturmitte behandeln oder so. Noitidart vor 8 Jahren 0

2 Antworten auf die Frage

1
i3v

Hören der "WIN" -Taste

Soweit ich es verstehe, ist der einzige Grund, warum Sie möglicherweise keine Ereignisse von der "WIN" -Maus-Taste sehen, dass Sie nur auf Maus bezogene Ereignisse schauen, während die "WIN" -Taste auf der Tastatur "Rechts" erzeugt -Win “Tastenanschlag. Eigentlich wurde dieser Teil bereits in Kommentaren besprochen - das Remapping von "Right-Win" funktioniert einwandfrei.

Wiederholte RWin-Ereignisse gesendet

Ich kann bestätigen, dass Ereignisse wiederholt gesendet werden. AFAIK, jede Tastaturtaste funktioniert so - zB „F2“. Zumindest der folgende AHK- Trick zeigt, soweit ich das beurteilen kann, für "F2" und "RWin" dasselbe.

#InstallKeybdHook #InstallMouseHook 1::KeyHistory  

Das Gute an der „WIN“ -Taste ist, dass sie mechanisch einzelne Tastenanschläge erzeugen kann. Im Gegensatz zu den Neigungen der Räder - es ist ziemlich schwierig, einen "einzigen Klick" von ihnen zu erhalten - selbst mein kürzester Klick wird normalerweise als 3-5 separate Tastenanschläge behandelt.

Hören der Tasten für die Radneigung

Die "Microsoft-Maus- und Tastaturmitte" (Version 2.7.133.0) scheint das Verhalten der Maus zu ändern - die AHK kann keine WheelRight / WheelLeft-Ereignisse mehr hören. Dies lässt sich am einfachsten beheben, indem Sie das Microsoft-Tool deinstallieren. Nach meinen Experimenten hat dies jedoch keinen Einfluss auf die "WIN" -Taste.

Es sollte jedoch möglich sein, die Radkippungen auch ohne Deinstallation neu zuzuordnen. Mit den AHKHID- Beispielen 1 und 2 konnte ich 1FFDFF- und 1F0300- "Daten" von der rechten und linken Radkante abfangen, wobei UsagePage 12, Usage 1 mit "Microsoft Mouse and Keyboard center" installiert wurde, und nichts, nachdem ich es deinstalliert habe .

Wiederholtes Senden von Radneigungsereignissen

Ich persönlich habe am Ende einfach eine Verzögerung eingeführt, wie von Bob vorgeschlagen . Es sieht so aus, als ob der einfachste Code, der auf dem Code in dieser Frage basiert, in diesem Fall in Ordnung ist (obwohl er möglicherweise nicht optimal ist - ich bin kein Experte für AHK). Das folgende AHK-Skript ermöglicht es mir, Wheel-Tilt-Left auf "Ctrl + Alt + LeftArrow" und Wheel-Tilt-Right auf "Ctrl + Alt + RightArrow" umzustellen. Ich verwende diese Hotkeys in VirtuaWin, um zum vorherigen / nächsten virtuellen Desktop zu wechseln (eine Aufgabe, bei der "eine Antwort pro Klick" sehr wichtig ist), und es funktioniert perfekt. (Immer noch, wenn ich die "Tilt-Taste" gedrückt halte, erhalte ich ~ 5 Ereignisse pro Sekunde).

WheelRight:: if( not GetKeyState("WheelRight") ) sleep 200   Send,  Send,  Send,  Send,  Send,  return   WheelLeft::  if( not GetKeyState("WheelLeft") ) sleep 200  Send,  Send,  Send,  Send,  Send,  return    RWin::  Send,  return 

RWin funktioniert auch ohne diesen Trick.

Vielen Dank für diese Antwort, ich bin immer noch fest damit beschäftigt :( Es ist nicht die perfekte Lösung, aber es ist alles, was wir bekommen können, also habe ich es akzeptiert. Danke dafür! Noitidart vor 7 Jahren 0
1
Chema

Timer sind ideal, um sich wiederholende Ereignisse auf eine einzige Aktion zu reduzieren. Jedes Mal, wenn wir einen wiederholten Tastendruck erhalten, setzen wir das Timer-Intervall zurück, sodass die Aktion erst ausgeführt wird, wenn wir die Taste / die Taste loslassen.

Ich benutze dieses Skript mit der Radneigung:

; Prevent warning if we hold a button too long #MaxHotkeysPerInterval 200  ~MButton & WheelRight:: SetTimer ArrangeWindowRight, -50 return  ~MButton & WheelLeft:: SetTimer ArrangeWindowLeft, -50 return  ArrangeWindowRight: Send # return  ArrangeWindowLeft: Send # return 

ArrangeWindowRight und ArrangeWindowLeft werden also nur 50ms nach dem Loslassen der Neigung aufgerufen (beachten Sie das negative Vorzeichen im Timer-Intervall, damit es nur einmal ausgeführt wird; ohne es würde die Funktion immer wieder aufgerufen).

Was den Code von i3v angeht, so scheint es mir auf den ersten Blick, dass er das letzte wiederholte Ereignis verlangsamt ( sleep 200 if wheel is not pressed anymore). Ich frage mich, was die Verbesserung dort ist. Sie können auch die fünf Sends reduzieren Send ^!.

Prost!

Vielen Dank, Chema, dass du das geteilt hast! Ich habe bis heute keine Lösung. Ich werde dieses AHK-Skript ausprobieren! :) Noitidart vor 7 Jahren 0