Warum wird ein simulierter Mausklick (mit mouse_event) arbeiten auf ausgewählten Komponenten nur?
Habe ich mehrere Cursor (die sind eigentlich Formen), die gesteuert werden können, die von Ihrer jeweiligen Maus. (1 cursor für 1 user).
Benutze ich SetCursorPos
zu positionieren Sie den Standard-cursor (das original-system-cursor) in eine position, nicht nehmen, den Fokus aus meiner Anwendung, und verwenden Sie ShowCursor(false)
um es zu verbergen.
Ich habe eine Klasse, bekommt Sie den Griff von der Maus und der Koordinaten.
Wenn der Benutzer klickt auf ich den SetCursorPos
und die mouse_event
zu simulieren, die Klicks in die entsprechende position.
Meine simulierte Maus-Klicks funktionieren nur auf bestimmte Komponenten, die " OnClick-event (Es war eigentlich nur Knöpfe und Etiketten, aber ich experimentierte mit dem Zeug auf mein Projekt, nur um zu wissen, was wird oder wird nicht funktionieren):
Funktioniert es auf:
- Schaltflächen (TButton, TBitBtn, TAdvSmoothButton)
- TAdvGrid
- TMenuItem (aber das direkte Kind des TMainMenu nur)
- TRadioButton
Aber es funktioniert nicht auf:
- TLabel
- Panels (TPanel, TAdvSmoothPanel)
- TCoolBar
- TMenuItem (nicht direkt Kind von TMainMenu)
Dies ist mein code:
SetCursorPos(currentX , currentY);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Warum geht es nicht auf einigen Komponenten? Gibt es eine Abhilfe (denn ich möchte in der Lage sein, um Sie auf Etiketten mit mouse_event).
BEARBEITEN:
Ich habe versucht, zu überprüfen, ob die Klick-Funktion wirklich aufgerufen werden, also habe ich ShowMessage('clicked');
bevor die SetCursorPos-und mouse_event...aber komischerweise alles (minor edit: alles außer MenuItems) funktioniert jetzt (außer der Tatsache, dass ich eine Nachricht knallen jedesmal, wenn ich versuche etwas anzuklicken). Hat jemand eine Idee, warum dies verhält sich so?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint, hier zu arbeiten;
oder ohne
SetCursorPos
;ShowMessage
mit einemReleaseCapture;
, wenn es funktioniert, können Sie herausfinden, wer die Erfassung der Maus mitGetCaptureControl
/GetCapture
.ShowMessage
arbeitete für alles außer MenuItems. Ja, ich weiß, es ist wie Rätselraten... ich habe ein wenig mehr Beschreibung (ersten paar Zeilen) zu der Frage (wenn das zählt?).SWP_NOACTIVATE
nichts zu tun, es nicht die Verarbeitung der auf?SetWindowPos
heißt, ein Klick auf das Fenster immer noch aktiviert, auch wenn es nicht der Fall war, ist es nicht ein Grund für das ignorieren Klicks... ich bin eigentlich überrascht, wie es arbeitete, bevor, vielleicht einige Ihrer Klicks wurden durch einige transparente Teile Ihrer Formen. Aber wenn es der Fall versteckt sich die Formen würden gerade Sie es aus...mouse_event ist eigentlich veraltet, sollten Sie SendInput stattdessen sehen, ob das behebt überhaupt nichts (würde ich auch empfehlen, die Maus bewegen, eine Eingabe-Nachricht, mit SetCursorPos), auch, wenn Ihr tut dies für eine bestimmte Anwendung, PostMessage könnte eine viel bessere und einfachere alternative
Es funktioniert, durch Zufall gerade jetzt, diese Komponenten haben sich wohl gefangen die Maus. Sie müssen übergeben Sie die Maus-Zeiger-Koordinaten in der 2. und 3. arguments. Also: