代码编译连接通过,但运行不是理想结果
运行结果为:
  显示MessageBox,error number=0
感觉甚是奇怪,返回的错误为0,即运行成功为何又会转入if结构。
请高人指点。源码如下:#include <windows.h>
#include "resource.h"
#define MSGBOX(szString) MessageBox(NULL,szString,szAppName,MB_OK)
/////////////////////////////////////////////////////////////////////////
static TCHAR szAppName[]="Keyboard hook";
HHOOK hHook=NULL;
HINSTANCE hInstExe=NULL;
////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBeep(-1);
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
////////////////////////////////////////////////////////////////////////
BOOL StartHook()
{
DWORD dwThradId=2540;//注:此进程ID为任务管理器中查询的ID。
HINSTANCE hInst=(HINSTANCE)GetCurrentProcess();
hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,
hInst,dwThradId);
if(hHook==NULL)
{
TCHAR szErr[256]={0};
DWORD dwErr=GetLastError();
itoa(dwErr,szErr,10);
MSGBOX(szErr);
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////
BOOL StopHook()
{
return UnhookWindowsHookEx(hHook);
}
/////////////////////////////////////////////////////////////////////////
BOOL Dlg_OnInit(HWND hwnd,LPARAM lParam)
{
SendMessage(hwnd,WM_SETICON,ICON_BIG,
(LPARAM)LoadIcon((HINSTANCE)GetWindowLong(hwnd,
GWL_HINSTANCE),MAKEINTRESOURCE(IDI_KBH)));
SendMessage(hwnd,WM_SETICON,ICON_SMALL,
(LPARAM)LoadIcon((HINSTANCE)GetWindowLong(hwnd,
GWL_HINSTANCE),MAKEINTRESOURCE(IDI_KBH)));
return TRUE;
}
////////////////////////////////////////////////////////////////////////
void Dlg_OnCommand(HWND hwnd,int nID,HWND hWndCtl,UINT codeNotify)
{
switch(nID)
{
case IDCANCEL:
EndDialog(hwnd,nID);
break;
case IDC_HOOK:
StartHook();
break;
case IDC_UNHOOK:
StopHook();
break;
}
}
///////////////////////////////////////////////////////////////////////////
BOOL CALLBACK Dlg_Proc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
Dlg_OnInit(hwnd,lParam);
break;
case WM_COMMAND:
Dlg_OnCommand(hwnd,LOWORD(wParam),(HWND)lParam,HIWORD(wParam));
break;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstExe,HINSTANCE,LPSTR lpCmdLine,int)
{
DialogBox(hInstExe,MAKEINTRESOURCE(IDD_KBH),NULL,Dlg_Proc);
return 0;
}

解决方案 »

  1.   

    hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,
    hInst,dwThradId);
    你这句话错了,,(HOOKPROC)HookProc,hInst,dwThradId) 这三个参数有问题。
    MSDN 对三个参数要求有详细的说明,这里不罗索了。
      

  2.   

    我的set hook是这样写的:LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);glhHook=(HWND)SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInst,0);看不出楼主这个语句有什么问题,只是最后一个参数……嗯,没尝试过楼主这种用法,不知道对不对。
      

  3.   

    hMod
    [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process. 这个参数为NULL
      

  4.   

    解决了,呵呵,原来是给远程进程安装钩子需要将HookProc编写为Dll,