写了一个全局的Hook,但不知道为什么其他进程钩不了...请大牛们看看吧。
MyHook.h
#ifdef _cplusplus
#define EXPORT extern"C" _declspec(dllexport)
#define IMPORT extern"C" _declspec(dllimport)
#else
#define EXPORT _declspec(dllexport)
#endif
EXPORT void _stdcall InstallHook(HWND hwnd,int Message);
EXPORT void _stdcall UninstallHook();
MyHook.cpp
#include <Windows.h>
HINSTANCE hIns;
#include "MyHook.h"
#pragma data_seg("shared")
HWND hWnd;
HHOOK HOOK;
int msg;
char szAscii=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:shared,RWS")
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
hIns=hinstDLL;
default:break;
}
return true;
}
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if(nCode<0)
return CallNextHookEx(HOOK,nCode,wParam,lParam);
char* szKeyState="";
//CallNextHookEx(HOOK,nCode,wParam,lParam);
GetKeyboardState((PBYTE)szKeyState);
lstrcat((LPWSTR)szKeyState,(LPWSTR)"GetKeyState(VK_SHIFT)");
ToAscii(wParam,HIWORD(lParam),(PBYTE)szKeyState,(LPWORD)&szAscii,0);
SendMessage(hWnd,msg,szAscii,NULL);
return CallNextHookEx(HOOK,nCode,wParam,lParam);
}
void _stdcall InstallHook(HWND hwnd,int Message)
{
hWnd=hwnd;
msg=Message;
HOOK=SetWindowsHookEx(WH_KEYBOARD,HookProc,hIns,NULL);
}
void _stdcall UninstallHook()
{
UnhookWindowsHookEx(HOOK);
}
HookText.h
#ifndef HOOKText
#define HOOKText
#pragma comment(lib,"MyHookKey.lib");
#define WM_HOOK WM_USER+0x100
#ifdef _cplusplus
#define EXPORT extern"C" _declspec(dllexport)
#define IMPORT extern"C" _declspec(dllimport)
#else
#define EXPORT _declspec(dllexport)
#define IMPORT _declspec(dllimport)
#endif
IMPORT void _stdcall InstallHook(HWND hwnd,int Message);
IMPORT void _stdcall UninstallHook();
#endif
HookText.cpp
#include<Windows.h>
#include"resource.h"
#include"HookText.h"
INT_PTR CALLBACK DialogProc(
__in HWND hwndDlg,
__in UINT uMsg,
__in WPARAM wParam,
__in LPARAM lParam
);
int CALLBACK WinMain(
__in HINSTANCE hInstance,
__in HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nCmdShow
)
{
DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc,NULL);
return 0;
}
INT_PTR CALLBACK DialogProc(
__in HWND hwndDlg,
__in UINT uMsg,
__in WPARAM wParam,
__in LPARAM lParam
)
{
switch(uMsg)
{
case WM_INITDIALOG:
InstallHook(hwndDlg,WM_HOOK);
return TRUE;
case WM_HOOK:
if(LOWORD(wParam)==0x0d)
wParam=0x0a0d;
SendDlgItemMessage(hwndDlg,IDC_EDIT1,EM_REPLACESEL,NULL,wParam);
return TRUE;
case WM_CLOSE:
UninstallHook();
EndDialog(hwndDlg, 0);
return TRUE;
default:
break;
}
return FALSE;
}
[解决办法]
什么操作系统?如果是XP的话 应该问题不大。
不过如果是vista、win7 就得提权才能勾上。比如
EnableDebugPrivilege或者SetProcessToken之类的。