JOURNALRECORD 猫パンチでノックアウト
有名な 猫でもわかるプログロミング Windows SDK編 第2部 第165章 ジャーナルレコードとプレイバックその2
http://homepage2.nifty.com/c_lang/sdk2/sdk_165.htm
で勉強させて頂いております
親プログラムのメニューを押下するとDLLのStartRecord()に来ます(1)
その中でSetWindowsHookEx()を呼びますが、戻り値のhHookがNULLになってしまいます(2)
そこでエラー情報を表示(//*の部分)させると『アクセスが拒否されました』となります
SetWindowsHookEx()のアクセス拒否の原因をネットで調べてみましたが何処にも記載が見つかりません
もう3日も嵌まり込んでいます、教えてください、お願いします
なおコードは親プログラム・DLLともにマルチバイトを指定しております
#include <windows.h>
#include "hook04x.h"
#define MAX_RECORD 2000
HINSTANCE hInst;
HHOOK hHook;
HWND hWnd;
BOOL bHook = FALSE; //フック中
BOOL bRecord = FALSE; //記録済かどうか
int n;
EVENTMSG MyEvent[MAX_RECORD];
DWORD dwStart;
DWORD dwAdjust;
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved)
{
hInst = hInstance;
return TRUE;
}
//単にこのdllのインスタンスハンドルをグローバル変数にコピーしているだけです。
EXPORT BOOL StartRecord() .........(1)
{
memset(MyEvent, 0, sizeof(EVENTMSG));//構造体を0で初期化
//*LPVOID lpMsgBuf;
//*SetLastError(NO_ERROR); //エラー情報をクリアする
hHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)MyHookProc, hInst, 0); ....(2)
//*FormatMessage( //エラー表示文字列作成
//*FORMAT_MESSAGE_ALLOCATE_BUFFER |
//*FORMAT_MESSAGE_FROM_SYSTEM |
//*FORMAT_MESSAGE_IGNORE_INSERTS,
//*NULL, GetLastError(),
//*MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
//*(LPTSTR) &lpMsgBuf, 0, NULL);
//*MessageBox(NULL, (const char*)lpMsgBuf, NULL, MB_OK); //メッセージ表示//* LocalFree(lpMsgBuf);
if (hHook == NULL)
{
MessageBox(hWnd, "JOURNALRECORDフックに失敗しました", "Error", MB_OK);
return FALSE;
}
dwStart = GetTickCount();
n = 0;
bHook = TRUE;
bRecord = TRUE;
return TRUE;
}
EXPORT BOOL StartPlay()
{
【途中省略】
EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
EVENTMSG *lpEM;
if (nCode == HC_ACTION) {
lpEM = (EVENTMSG *)lp;
if (lpEM->message == WM_KEYDOWN && LOBYTE(lpEM->paramL) == VK_CANCEL) {
PostMessage(hWnd, WM_RECORD_END, 0, 0);
PostMessage(hWnd, WM_END_HOOK, 0, 0);
return TRUE;
}
MyEvent[n].hwnd = lpEM->hwnd;
MyEvent[n].message = lpEM->message;
MyEvent[n].paramH = lpEM->paramH;
MyEvent[n].paramL = lpEM->paramL;
MyEvent[n].time = lpEM->time;
n++;
if (n >= MAX_RECORD-1) {
PostMessage(hWnd, WM_RECORD_MAX, 0, 0);
PostMessage(hWnd, WM_END_HOOK, 0, 0);
return TRUE;
}
return TRUE;
}
return CallNextHookEx(hHook, nCode, wp, lp);
}