PDA

Visualizza la versione completa : [C++] Inviare WM_LBUTTONDOWN a child window in finestra qualsiasi


kirakira93
10-01-2011, 19:55
Premetto che sono vicino alla soluzione, ma mi sfugge qualcosa.

Se non avete voglia di leggere, bhe vi assicuro che è un problema interessante, vi consiglio di darci un occhio! :D

Mio cugino ha una cartella con dentro 6 giga di musica, un giorno mi fa: "Riesci a farmi un programma che se premo un tasto mi cancellala canzone che sto ascoltando, così posso filtare le canzoni belle dai 6 giga che ho finchè gioco".
Io gli dico che non ci sono problemi, avevo due soluzioni in mente:
1 creare una sorta di lettore musicale e tramite le hook globali capire se si preme un tasto, quindi cambiare il file in riproduzione (perchè altrimenti non si può cancellarlo) e cancellare il file.

2 scaricare un lettore musicale diverso da Windows Media Player, uno con interfaccia molto semplice, (io hoi scaricato yPlay, ecco l'interfaccia (http://img209.imageshack.us/i/image1xq.jpg/) ), e leggere dal titolo tramite GetWindowText la canzone in riproduzione, aggiungere la path dove si trova la cartella delle canzoni (che viene spedita al programma da file) e fare un bel DeleteFile!
Prima però bisogna cambiare il file audio in riproduzione! Subito ho pensato a i tasti speciali della tastiera che lo consentono...ma yPlay non li supporta.

Così ho deciso di inviare un Wm_COMMAND con BT_CLICKED (o BN_CLICKED non mi ricordo xD) specificando l'HWND di yPlay, trovata con FindWindow() (che cerca la classe della finestrqa di yPlay FindWindow("ThunderRT6FormDC",NULL) ), poi mi sono accorto che yPlay è una finestra stupida! e piuttosto di fare la OWNER_DRAW sui bottoni, li ha creati a mano gestendo probabilmente la notifica del mouse.

Nietne paura :) Semplicemente ho cercato l'HWND che contiene questi "falsi bottoni", mediante un lungo lavoro di FindWindowEx(yPlay,Child_precedente,NULL,NULL);
Niente paura anche qui, ho scoperto che la ChildWindow che contiene i pulasanti si può trovare servendosi di questo:
HWND _1 = NULL, _2 = NULL;
win = (HWND)393874;
while(1)
{
_1 = FindWindowEx(win, _2,NULL,"");
if(_1 == NULL)
break;
RECT rect;
GetWindowRect(_1,&rect);
_2 = _1;
e la n-esima finstra che si ottiene (non mi ricordo il numero preciso) è SEMPRE la childwindow che cerco!

Soddisfatto, allora ho pensato: "bene :) basta inviare un semplice messaggio con SendMessage", ecco il codice:

HWND win = finstra della child window contenente i "pulsanti"

SHORT x, y;
x = 151;
y = 20;
DWORD param = (DWORD)x;
param |= (DWORD)y << 16;

SetCursorPos(rect.left + x, rect.top + y);

SendMessage(win,WM_LBUTTONDOWN,MK_LBUTTON,param);
SendMessage(win,WM_LBUTTONUP,MK_LBUTTON,param);

E invece niente da fareeeee...non capisco perché me lo sto chiedendo in tutte le lingue del mondo!!

Aspetto interessamenti, anche perché è interessante come problema!

lolide
10-01-2011, 20:24
Se fosse una semplice immagine ?

prova a mandare STN_CLICKED tramite WM_COMMAND

http://msdn.microsoft.com/en-us/library/bb760784(v=VS.85).aspx

kirakira93
10-01-2011, 20:37
ci avevo pensato...ma se fosse un immagine, sarebbe un common control => child window.

Comunque tentar non nuoce, intanto se non funziona ho visto che forse può centrare c'è l'input è inviato da un altro thread...forse questa può aiutare:

http://msdn.microsoft.com/en-us/library/ms681956(VS.85).aspx

cosa dici?

linoma
11-01-2011, 20:31
Forse se mandi un sendmessage cn 0x00050005 ti funge.

kirakira93
11-01-2011, 20:54
domani provo..perchè adesso sono stanchiissimo, grazie dell'interressamento!

Loading