2017-03-15 7 views
0

Ceci est une autre question que j'ai liée à setWindowsHookEx, j'ai écrit une petite application pour accrocher dll dans Windows calculator applicatio. Fondamentalement, exe application injecter le dll en calculator et il surveille tous les événements de souris vers le bas qui se passe à l'application de la calculatrice. Et actuellement, je suis capable de désactiver tous les événements de souris vers le bas qui se passe à la calculatrice. Cependant, je veux le faire en fonction de l'emplacement de la souris. Plus précisément, lorsque le bouton de la souris clique sur un élément de la barre de menu spécifique. J'ai essayé d'obtenir ceci en utilisant GetWindowText pour récupérer le texte où pointe le bouton, mais la plupart du temps il renvoie le texte de fenêtre au lieu de l'article de fenêtre (menu item) qu'il pointe. Voici le code que j'ai écrit pour cela. Toute idée sur la façon de désactiver un élément de fenêtre particulier sur la barre de menu.SetWindowsHookEx, identifiant la boîte de dialogue Windows où la souris pointe

code EXE qui appellent SetWindowsHookEx

// program.exe.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <Windows.h> 
#include <string> 
#include <io.h> 

using namespace std; 

void Usage() 
{ 
    printf("Usage: InjectDLL pid path-to-dll [-privilege]"); 
} 


int _tmain(int argc, char* argv[]) 
{ 

    /* 
    * Load library in which we'll be hooking our functions. 
    */ 
    HMODULE dll = LoadLibrary(L"C:\\drivers\\dllinject.dll"); 
    if (dll == NULL) { 
     printf("The DLL could not be found.\n"); 
     getchar(); 
     return -1; 
    } 

    /* 
    * Get the address of the function inside the DLL. 
    * [email protected] is used to hook into 32bit applications 
    */ 
    //HOOKPROC addr = (HOOKPROC)GetProcAddress(dll, "[email protected]"); 
    HOOKPROC addr = (HOOKPROC)GetProcAddress(dll, "hookmethod"); 
    if (addr == NULL) { 
     printf("The function was not found.\n"); 
     getchar(); 
     return -1; 
    } 

    /* 
    * Hook the function. 
    */ 
    DWORD procID=0; 

    HWND targetWnd = FindWindowA("CalcFrame", "Calculator"); 


    wchar_t msgBuf[1024] = L""; 
    wchar_t msgBuf2[1024] = L""; 
    wsprintf(msgBuf, L"the thread Id is : %d , process id is : %d ", threadID, procID); 

    OutputDebugString(msgBuf); 

    // 
    //WH_KEYBOARD_LL 
    HHOOK handle = SetWindowsHookEx(WH_GETMESSAGE, addr, dll, threadID); 
    //HHOOK handle = SetWindowsHookEx(WH_CALLWNDPROC, addr, dll, threadID); 
    //HHOOK handle = SetWindowsHookEx(WH_MSGFILTER, addr, dll, threadID); 
    DWORD x = GetLastError(); 
    wsprintf(msgBuf2, L"the last error is %d", x); 
    OutputDebugString(msgBuf2); 
    if (handle == NULL) { 
     printf("The KEYBOARD could not be hooked.\n"); 
    } 
    else{ 
     printf("Program successfully hooked.\nPress enter to unhook the function and stop the program.\n"); 
    } 

    /* 
    * Unhook the function. 
    */ 

    getchar(); 
    UnhookWindowsHookEx(handle); 

    return 0; 
} 

dll qui est utilisé pour bloquer le clic de l'élément de barre de menu.

#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 

static HWND s_hWndButton; 

INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) { 

    switch (Reason) { 
    case DLL_PROCESS_ATTACH: 
     OutputDebugString(L"DLL attach function called11.\n"); 
     break; 
    case DLL_PROCESS_DETACH: 
     OutputDebugString(L"DLL detach function called.\n"); 
     break; 
    case DLL_THREAD_ATTACH: 
     OutputDebugString(L"DLL thread attach function called.\n"); 
     break; 
    case DLL_THREAD_DETACH: 
     OutputDebugString(L"DLL thread detach function called.\n"); 
     break; 
    } 

    return TRUE; 
} 

extern "C" __declspec(dllexport) LRESULT __stdcall hookmethod(int code, WPARAM wParam, LPARAM lParam) { 

    TCHAR msgBuftext[65536]; 
    TCHAR msgBufhandle[65536]; 
    TCHAR msgBufhandletext[65536]; 
    TCHAR msgBufwintext[2048]; 
    if (code >= 0) { 
     MSG* cp = (MSG*)lParam; 
     int txtlen = GetWindowTextLengthW(cp->hwnd); 
     GetWindowText(cp->hwnd, msgBufhandletext, txtlen); 

     wsprintf(msgBufhandle, L"Handle %X", cp->hwnd); 
     wsprintf(msgBufwintext, L"Window Text %s", msgBufhandletext); 

     LPMSG msg = (LPMSG)lParam; 

     if (msg->message == WM_LBUTTONDOWN) { 
      OutputDebugString(msgBufwintext); 

      msg->message = WM_NULL; 

     } 

    } 

    return(CallNextHookEx(NULL, code, wParam, lParam)); 
} 

Répondre

0

Pour ceux qui sont intéressés, je voudrais poster la réponse que j'ai été en mesure de mettre en œuvre. Fondamentalement, au lieu d'écouter WH_GETMESSAGE, j'ai changé la chaîne de crochet à WH_MSGFILTER. Raison parce que, il me permet de trouver l'ID de l'élément de menu lorsque je déplace la souris sur l'élément de menu et quand l'événement bouton se produit, je peux vérifier l'ID de l'élément de menu et désactiver le clic de souris en changeant le message à WM_NULL. Voici l'exemple de code de travail. Il permet également u de bloquer l'événement si l'utilisateur est navig

code dll

#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 
#include <Winuser.h> 
#include <Lmcons.h> 
#include "nxlrunner.h" 

WORD wMenuItemID; 


INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) { 

    switch (Reason) { 
    case DLL_PROCESS_ATTACH: 
     OutputDebugString(L"DLL attach function called11.\n"); 
     break; 
    case DLL_PROCESS_DETACH: 
     OutputDebugString(L"DLL detach function called.\n"); 
     break; 
    case DLL_THREAD_ATTACH: 
     OutputDebugString(L"DLL thread attach function called.\n"); 
     break; 
    case DLL_THREAD_DETACH: 
     OutputDebugString(L"DLL thread detach function called.\n"); 
     break; 
    } 

    return TRUE; 
} 

extern "C" __declspec(dllexport) LRESULT __stdcall meconnect(int code, WPARAM wParam, LPARAM lParam) { 

    switch (code) 
    { 
     case MSGF_MENU: // message is for a menu 
     { 
      MSG* pMSG = (MSG*)lParam; 

      switch (pMSG->message) 
      { 
       case WM_MENUSELECT: 
       { 

        wMenuItemID = LOWORD(pMSG->wParam); 
        break; 
       } 
       case WM_LBUTTONDOWN: 
       { 
        break; 
       } 

       case WM_LBUTTONUP: 
       { 
        if (wMenuItemID == 10353){ 
         wchar_t usernamew[UNLEN]; 
         DWORD username_len = UNLEN + 1; 
         GetUserNameW(usernamew, &username_len); 
         MessageBoxW(NULL, usernamew, L"Title", MB_OK); 
         pMSG->message = WM_NULL; 
        } 
        break; 
       }     
       case WM_LBUTTONDBLCLK: 
       { 
        if (wMenuItemID == 10353){ 
         pMSG->message = WM_NULL; 
        } 
        break; 
       } 
       case WM_KEYDOWN: 
       { 
        switch (pMSG->wParam) 
        { 
         case VK_RETURN: 
         { 
          if (wMenuItemID == 10353){ 
           MessageBoxW(NULL, L"Message to user", L"Title.", MB_OK); 
           pMSG->message = WM_NULL; 


          } 
          break; 
         } 
        } 

        break; 
       } 
       case WM_KEYUP: 
       { 


        switch (pMSG->wParam) 
        { 
        case VK_RETURN: 
        { 
         if (wMenuItemID == 10353){ 
          MessageBoxW(NULL, L"Message to user", L"Title", MB_OK); 
          pMSG->message = WM_NULL; 


         } 
         break; 
        } 
        } 
        break; 
       } 

      } 

      break; 
     } 

    } 



    return false; 
} 

windows hooking

system message hooks

Call MSG Filter function

msg structure

sample code

keyboard codes

sample code from internet