Hook sur fenetre (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 8 501 fois - Téléchargée 651 fois

Description

Comme promis un exemple de hook. C'set tout bete car je n'avais aucune idee de quoi faire.
Il y a une fenetre avec 3 edit. Le hook intercepte les messages WM_RBUTTONUP (releve du bouton droit de la souris). Si fenetre cible est fenetre principale elle se ferme sinon on ecrit "Y a un HOOK" dans fenetre fille, edit dans ce cas.

Source / Exemple :


#include <windows.h>

HINSTANCE hinst;
HWND hmain, hed1, hed2, hed3;
HHOOK hhk = 0;
char szappname[] = "MsgHook";
char szEDIT[] = "EDIT";

// le HOOK LOCAL est ICI
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  MSG *lpmsg;
  lpmsg = (MSG*) lParam;
  if(nCode < 0) goto defRet; // NE JAMAIS TOUCHER DANS CE CAS
  if(lpmsg->message == WM_RBUTTONUP) {
    if(IsChild(hmain, lpmsg->hwnd)) SetWindowText(lpmsg->hwnd, "Y a un HOOK");
    else PostMessage(lpmsg->hwnd, WM_CLOSE, 0, 0);
    return 1;
  }
defRet:
  return (CallNextHookEx(hhk, nCode, wParam, lParam));
}

LRESULT CALLBACK AppWndProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_CREATE:
      hed1 = CreateWindow(szEDIT, 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
        10, 10, 300, 20, hwnd, (HMENU) 1000, hinst, 0);
      hed2 = CreateWindow(szEDIT, 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
        10, 60, 300, 20, hwnd, (HMENU) 1001, hinst, 0);
      hed3 = CreateWindow(szEDIT, 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
        10, 110, 300, 20, hwnd, (HMENU) 1002, hinst, 0);
      hhk = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, 0, GetCurrentThreadId());
      return 0;
    case WM_SETFOCUS:
      SetFocus(hed1); return 0;
    case WM_DESTROY:
      if(hhk) UnhookWindowsHookEx(hhk);
      PostQuitMessage(0);
      return 0;
  }
  return DefWindowProc(hwnd, mssg, wParam, lParam);
}

DWORD InitInstance()
{
  WNDCLASSEX wndcls;
  RECT rct;
  memset(&wndcls, 0, sizeof(WNDCLASSEX));
  wndcls.cbSize = sizeof(WNDCLASSEX);
  wndcls.lpfnWndProc   = AppWndProc;
  wndcls.style         = CS_HREDRAW | CS_VREDRAW;
  wndcls.hInstance     = hinst;
  wndcls.lpszClassName = szappname;
  wndcls.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);
  wndcls.hCursor       = LoadCursor(0, IDC_ARROW);
  if(!RegisterClassEx(&wndcls)) return 0;
  hmain = CreateWindowEx(0, szappname, szappname, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                        0, 0, hinst, 0);
  return (hmain != 0);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
  MSG msg;
  hinst = hInstance;
  if(!InitInstance()) return 0;
  ShowWindow(hmain, SW_NORMAL);
  while(GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return 0;
}

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
16
Date d'inscription
mercredi 16 juillet 2003
Statut
Membre
Dernière intervention
29 octobre 2008

J'ai encore tenté de la compilé cette source ça plante arf, sinon ça a l'air interessant. :)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Le problème est que je l'utilise pour des menus owner-draw.
Et vu que les menus ont leur propre boucles de messages, je ne peux pas récupérer les WM_DRAWITEM, c'est pourquoi j'ai pensé au hook
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Pas le temps de tester mais si tu as une pompe à messages, prends les direct à cet endroit, c'est normalement imparable. J'ai fait ainsi dans un autre exemple de source pour les raccourcis claviers, tout simple à implémenter et va impec.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Dans ce hook, tu interceptes WM_RBUTTONUP
Je souhaiterais faire la même chose, mais avec WM_DRAWITEM et WM_MEASUREITEM.
Visiblement ils ne sont pas interceptés par ce hook, je vois pas pourquoi...
Tu as une idée?
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Merci pour l'exemple. Ca me retire une épine du pied.
Je souhaitais hooker aussi la souris dans une de mes application. Grace a toi je vois mieux le principe.
J'etais en train de me fourvoyer et de perdre beaucoup de temps. Je m'interessais au hook de souris au lieu des message. Normalement cela devrait etre suffisant. Si non je reprendrais mon Hook de souris.
Ce que je souhaite faire c'est dans un conteneur ActiveX : IWebBrowser2 popur enpecher le clic droit ou le remplacer par mon propre menu.

Merci de ta participation
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.