2017-03-15 15 views
0

これは私がsetWindowsHookExに関連するもう1つの質問です。dllをウィンドウにフックするために小さなアプリケーションを作成しましたcalculator applicatio。基本的にexeアプリケーションはdllcalculatorに挿入し、電卓アプリケーションで発生しているすべてのマウスダウンイベントを監視します。そして現在、電卓で起こっているマウスのダウンイベントをすべて無効にすることができます。しかし、私はそれがマウスが指している場所に基づいて完了したい。具体的には、マウスボタンが特定のメニューバー項目をクリックしているとき。私はこれをGetWindowTextを使って、ボタンが指しているテキストを取得するようにしようとしましたが、ウィンドウ項目(menu item)の代わりにウィンドウテキストを返しています。以下は私がこれについて書いたコードです。メニューバー上の特定のウィンドウ要素を無効にする方法に関するアイデア。メニューバー項目のクリックを阻止するために使用されては、SetWindowsHookExSetWindowsHookEx、マウスが指し示しているウィンドウのダイアログを識別する

// 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を呼び出す

EXEコード。

#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)); 
} 

答えて

0

興味のある方は、私が実装できた回答を投稿したいと思います。基本的には、WH_GETMESSAGEを聞くのではなく、フックチェーンをWH_MSGFILTERに変更しました。理由は、メニュー項目の上にマウスを移動したときにメニュー項目IDを見つけることができ、ボタンアップイベントが発生したときに、WM_NULLにメッセージを変更してメニュー項目IDを確認し、マウスクリックを無効にできるからです。以下は、作業コードサンプルです。ユーザがnavigatある場合、それはまた、イベントをブロックするためにUを有効

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

関連する問題