MouseHook avec DialogBox

mouloudh Messages postés 26 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 5 août 2011 - 4 août 2011 à 19:08
mouloudh Messages postés 26 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 5 août 2011 - 5 août 2011 à 23:05
Bonjour la communauté,
Je désespère. Voilà plus d'un mois que je cherchais une solution pour un programme (une souris visuelle qui doit rester toujours visible)-
Cela m'a amené à la découverte du Hook. Un membre du forum m'avait conseillé une doc pour Win32.
J'ai récupéré un source sur le forum (cppfrance_DISTANCE-PARCOURRUE-SOURIS-WIN32-HOOK___Page.zip). Je l'ai modifié comme suit:

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved)
{
// si attachée par un nouveau processus, sauvegarder l'instance de la librarie,
// rechercher la fenêtre destinatrice des messages et récupérer l'Id du message
// (unique dans le système)
if(fdwReason == DLL_PROCESS_ATTACH)
{
m_hDllInstance = hInstance;
m_hWndDest = FindWindow(_T("VMouse_MainFrame"), NULL);
m_MsgMouseHook = RegisterWindowMessage(MSG_MOUSEHOOK);
m_dwProcessId = GetCurrentProcessId();
}

// retour
return TRUE;
}

BOOL MOUSEHOOKAPI InstallHook(HWND hWnd)
{
// si hook déjà installé
if(m_hHook != NULL)
return FALSE;
// installation hook
m_hWndDest = hWnd;
m_hHook = SetWindowsHookEx(WH_MOUSE, MouseProc, m_hDllInstance, 0);
return (m_hHook != NULL);
}
BOOL MOUSEHOOKAPI RemoveHook()
{
// si pas de hook installé
if(m_hHook == NULL)
return TRUE;

// suppression hook
return UnhookWindowsHookEx(m_hHook);
}


LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// en fonction du code
if(nCode == HC_ACTION)
{
if(m_hWndDest && (wParam WM_LBUTTONDOWN || wParam WM_RBUTTONDOWN))
{
// récupération coordonnées de la souris
LPMOUSEHOOKSTRUCT lpmhs = (LPMOUSEHOOKSTRUCT) lParam;
PostMessage(m_hWndDest, m_MsgMouseHook, wParam, 0);
}
}
// retour
return CallNextHookEx(m_hHook, nCode, wParam, lParam);
}


Avec toutes les variables en static, comme à l'origine.
Depuis 2 mois que je cherche à modifier le code de la fenêtre cible, sans succès. Je suis parvenu à vérifier que mon Hook génère le bon code (dans un EditBox), sans plus. Le traitement graphique, echec total.

J'ai décidé de travailler avec un DialogBox pour me simplifier les traitements graphiques, et toujours sans succès! Je ne détecte pas le message du Hook. Je l'ai placé dans OnPaint, toujours rien.
extrait de OnPaint()
.
.
.
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
if(message == m_MsgMouseHook)
MsgMouseHook(wParam, lParam);
CDialog::OnPaint();
}
}

void CVMouseDlg::MsgMouseHook(WPARAM wParam, LPARAM lParam)
{
if(message == m_MsgMouseHook)
{
switch(wParam)
{
case WM_LBUTTONDOWN :
m_CValue = "Left";
DisplayButton(m_CValue);
UpdateData();
break; //Edit_SetText(m_hEdit,"Right")
case WM_RBUTTONDOWN :
m_CValue = "Right";
DisplayButton(m_CValue);
UpdateData();
break; //Edit_SetText(m_hEdit,"Right")
}
}
}


Là, je commence à saturer!
Merci infiniment pour toute aide! si plus de code est nécessaire, évidemment n'hésitez pas! C'est sûr, il est loin d'être parfait.

Make it simple, keep it easy !

2 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
5 août 2011 à 09:34
Hello,
Je pense que tu parles de cette source.
Que cherches-tu à faire exactement?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
mouloudh Messages postés 26 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 5 août 2011
5 août 2011 à 23:05
Bonjour,
Il s'agit bien de cette source. Ce que je souhaite faire est ceci:
au repos, ma souris est:

[ ][ ]
[____]
au clic gauche, je dois avoir:

[X][ ]
[____]


et au clic droit:

[ ][X]
[____]

J'ai réussi à modifier le code du Hook pour détecter le bon clic, puis l'afficher dans l'EditBox, mais ce je souhaite faire, c'est superposer des images bmp, les unes sur les autres. Après tant d'essais, je crois que le mieux pour moi, serait de tenter les Dialog box en MFC, et encore les plus simples, c'est à dire, sans les DocumentViews etc..Mais alors, où, intégrer l'appel du Hook? J'ai essayé dans la classe MyDialog::OnPaint() en y insérant le test if(message == m_MsgMouseHook)
MsgMouseHook(wParam, lParam);
sans succès, MsgMouseHook rends une valeur, et il ne faudrait pas! Enfin, je m'y perds en GROS!

Que faut-il modifier dans le DialogBox pour que Hook soit pris en compte?

Dans la version Win32, j'ai réussi à afficher la première image (aucun clic). J'ai ajouté 2 ou 3 booléens que je modifie par la fonction MsgMouseHook, ensuite je récupère leurs valeurs dans WndProc (où j'ai réussi à mettre le premier affichage), et je pensais qu'avec l'aide des booléens, je pourrais choisir l'image à afficher, une manière d'effacer l'image initiale, puis de mettre à la place la bonne image etc...Mais toujours pas! Et voilà toute l'histoire de ce programme! Encore mille merci pour toute aide.

Make it simple, keep it easy !
0
Rejoignez-nous