Invia il clic del mouse per Winamp
Domanda
Sto cercando di imparare l'emulazione del mouse / tastiera usando Vinci API.
Ho scoperto che è possibile emulare il pulsante fare clic utilizzando la funzione SendMessage ().
Bene, ottengo le coordinate del pulsante "PLAY" (è (60; 100)) e cercando di premere questo pulsante utilizzando il seguente codice:
int x = 60;
int y = 100;
int lParam = ((x << 16) | (y & 0xffff));
int parentWindow = FindWindow("BaseWindow_RootWnd", "Main Window");//get main winamp window
MessageBox.Show(parentWindow.ToString());//failed if 0
SendMessage(parentWindow, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(lParam));//send left mouse button down
SendMessage(parentWindow, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(lParam));//send left mouse button up
.
Ma questo codice non ha alcun effetto sul Winamp.
Qualcuno può indicarmi sugli errori che ho fatto? Qualsiasi aiuto è molto apprezzato!
P.S. Non è applicabile per me spostare il mouse sul pulsante di riproduzione di Winamp, rispetto a un clic, che spostarlo indietro.
Anche per Winamp è impossibile ottenere la maniglia del pulsante. Con maniglia del pulsante SendMessage () funziona abbastanza bene, ma con le coordinate non lo è affatto.
aggiunta # 1
Bene, il codice sopra attiva la finestra Winamp e lo mostra, se fosse ridotto al minimo. Ma il pulsante Play Stil non vuole essere spinto; (
aggiunta # 2
Qui ci sono messaggi che ottengo dopo l'esecuzione del codice sopra.
Soluzione 2
Bene, per simulare il clic del mouse in Winamp Winamp è necessario fare esattamente cosa sta succedendo quando lo fai semplicemente con il mouse hardware. Quanto segue è stato scoperto da Spy ++:
Quindi per emulare il clic del mouse abbiamo bisogno di:
- .
- Chiama due volte
PostMessage()
anzichéSendMessage()
perché "P" nello screenshot sopra ci dice che il messaggio è stato ottenuto dal postmessage () (secondo MSDN ) - I parametri dovrebbero essere i seguenti per il primo postmessaggio ():
- Primo parametro - Maniglia per finestre Winamp (nel nostro caso è005E09FA
) - Secondo parametro - il codice WinAPI dell'evento, quando il tasto sinistro del mouse è giù (WM_LBUTTONDOWN = 0x201
) - Terzo parametro -MK_LBUTTON = 0x1
(sembra, è necessario passarlo. Sarebbe bello se qualcuno può spiegare perché)
- Quarto parametro - Coordinate del punto in cui si desidera premere il tasto del mouse (questo parametro può essere calcolato come seguente -((Y << 16) | X)
) - I parametri dovrebbero essere i seguenti per il secondo postmessage ():
- Primo parametro - Maniglia per finestre Winamp (nel nostro caso è005E09FA
) - Secondo parametro: il codice WinAPI dell'evento, quando il tasto sinistro del mouse è attivo (WM_LBUTTONUP = 0x202
) - Terzo parametro -0
oIntPtr.Zero
- Quarto parametro - Coordinate del punto in cui si desidera rilasciare il tasto del mouse (è necessario essere come nel primo postMessage () se si desidera fare clic con il tuo clic per avere un effetto; questo parametro può essere calcolato come seguente -((Y << 16) | X)
)Grazie a tutti per il loro contributo!
Altri suggerimenti
Per consentire a Winamp Play / Pausa la canzone corrente, è sufficiente inviarlo un messaggio Play / PAUSE, che è lungo 40046 come definito in winamp.h
.Dovrai inviarlo in un messaggio WM_WA_IPC
(che è un messaggio utente, noto anche come WM_USER
) anziché un WM_LBUTTONDOWN
.
Allora, qualcosa del genere dovrebbe fare:
SendMessage(parentWindow, WM_USER, IntPtr.Zero, new IntPtr(40046));
.
Dovresti usare SendInput()
per inviare input ad altre applicazioni, non fatturare messaggi.