1

メモ帳の Edit クラスに SetWindowsHookEx を設定しましたが、ここから続行する方法がわかりません。

Edit クラスを自分のプロシージャにサブクラス化し、テキストを操作するか、ファイルに保存するだけで、メモ帳コントロール/クラスに送り返す必要があります。

メモ帳からテキストを取得する簡単な方法がありますが、私は WINAPI とサブクラス化を学習しようとしているので、これは学習するのに適した方法です。

私の SetWindowsHookEx は次のようになります。

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll, npThreadId); 

フック タイプ : WH_GETMESSAGEを使用してメモ帳の Edit クラスからテキストを取得し、それを GetMsgProc(I think) 関数に転送するにはどうすればよいですか?

それはまったく正しいフックタイプですか?

メッセージを送りますか?はいの場合、どうすればよいですか?

私のコードは次のようになります。

dllHeader.h:

#ifdef DLLAPI
#else
#define DLLAPI extern "C" __declspec(dllimport)
#endif
DLLAPI bool hookNotepad();

dll.cpp:

#include "stdafx.h"
#include <windows.h>
#define DLLAPI extern "C" __declspec(dllexport)
#include "dllHeader.h"

// Forward references
LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);

// Global variables
HHOOK g_hHook = NULL;        // Hook for Notepad 'EDIT' class
HINSTANCE g_hInstDll = NULL; // DllMain entry (DLL_PROCESS_ATTACH)
HWND npHWND = NULL;          // Notepad handle
DWORD npThreadId = NULL;     // Notepad thread ID
HWND npeHWND = NULL;         // Notepad 'EDIT' class handle


BOOL APIENTRY DllMain(HMODULE hModule,  DWORD ul_reason_for_call,  LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        g_hInstDll = hModule;
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

bool hookNotepad ()
{
    npHWND = FindWindow(TEXT("Notepad"), NULL); // Finds Notepad

    if (npHWND) //Notepad found
    {
        npeHWND = FindWindowEx(npHWND, NULL, L"Edit", NULL); // Finds the 'EDIT' class in notepad
        npThreadId = GetWindowThreadProcessId(npeHWND, NULL); //Find ThreadID for Notepad 'EDIT' class
        g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll, npThreadId); //Set hook in Notepad 'EDIT' class

        if (g_hHook) //if the hook is a succes then...
        { 
            MessageBox(NULL,TEXT("Hook set in Notepad EDIT class!"), NULL, MB_OK); 
            // Now what? How to subclass the npeHWND (The 'EDIT' class of Notepad) to my own procedure? 
        }
        else
        {
            MessageBox(NULL,TEXT("SetWindowsHookEx error!"), NULL, MB_OK); //If the hook fails.
        }
    }
    return 0;
}

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode >= 0)
    {
        MessageBox(NULL,TEXT("This never get called. Why?"), NULL, MB_OK);
    }
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

exe.cpp

#include <stdlib.h>
#include "stdafx.h"
#include <strsafe.h>

#include "C:\Users\Kristensen\Documents\Visual Studio 2012\Projects\dll\dll\dllHeader.h"

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{

    hookNotepad();
    return 0;
}

ここからの進め方が少しわかりません…何かヒントはありますか?リンク?チップ?

SetWindowsHookEx関数に関する MSDN のドキュメントを読みましたが、明確な答えが見つかりませんでした。

4

1 に答える 1

2

WH_GETMESSAGEは、フックされたスレッドが呼び出しGetMessage()またはPeekMessage()そのメッセージ キューからメッセージを取得するときに呼び出されますが、すべてのメッセージがメッセージ キューを通過するわけではないため、WH_CALLWNDPROC/RETインターセプトしようとしているメッセージの種類によっては、フックも使用する必要がある場合があります。

グローバル変数は共有メモリのブロックに保存する必要があります。そうしないと、他のプロセスをフックするときに DLL の新しいコピーがロードされるため、フックをインストールするプロセスのみがアクセスできるようになります。

HWND別のプロセスが所有する をサブクラス化することはできません。そのプロセスにコードを挿入する必要があり、そのコードは必要に応じてローカルでサブクラス化できます。 SetWindowsHookEx()他のプロセスにコードを挿入するために使用できCreateRemoteThread()ますが、必要に応じて、そのために使用する方がよい場合があります。

于 2013-05-09T02:26:17.060 に答える