rt
如何写一个全局钩子所需的的dll????
如何写一个全局钩子所需的的dll????
解决方案 »
- 无效的 SQL语句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'
- sizeof和strlen一个有趣的问题
- 如何修改vc中编译连接的声音?
- 关于创建控制台
- CBCGCalendar 日历控件
- 祝jennyvenus新年快乐并在水园早得两星...
- fopen()怪问题,请帮忙,急!
- 能不能将*.bmp转化成*.ico格式?
- 请教一个关于“静态数据成员(static data members)”的问题
- 怎样将其它类里的CString m_pstr传给CView类里的CString str?并显示?
- 调试程序遇到的一个小问题,大虾帮帮忙啊!!
- 如何把MP3文件加载到内存中并播放
#include <afxdllx.h>
#include "HookClass.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma data_seg("SHARDAT")
CHookClass HookClass;
HINSTANCE hInst = NULL ;
HHOOK hLLKeyboardHook = NULL; #pragma data_seg()
#pragma comment(linker,"/SECTION:SHARDAT,RWS")
char strModulePath[MAX_PATH] ;// Handle to LowLevel kbd hookstatic AFX_EXTENSION_MODULE SKHookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
hInst = hInstance;
if (!AfxInitExtensionModule(SKHookDLL, hInstance))
return 0;
new CDynLinkLibrary(SKHookDLL);
GetSystemDirectory(strModulePath,MAX_PATH);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("TFHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(SKHookDLL);
}
return 1; // ok
}void __declspec(dllexport) __StartHook()
{
HookClass.StartHook();
}
void __declspec(dllexport) __StopHook()
{
HookClass.StopHook();
}LRESULT CALLBACK LowLevelKeyboardFilterProc(int nCode,
WPARAM wParam,
LPARAM lParam)
{
/* if(HC_ACTION==nCode)
{
FILE *file;
file = fopen("c:\\test.txt","a+");
fprintf(file,"%08X-%08X\n",wParam,lParam);
fclose(file);
}
/*/
SHORT wState = GetKeyState(VK_CONTROL);
if(!((DWORD)lParam&0x80000000) && (HC_ACTION==nCode) && ((wParam == 191) && (wState&0x8000) || ((wParam == 0xFF) && (((DWORD)lParam&0x1FF0000) == 0x1260000))))
{
CString str = strModulePath;
str += "\\TFRRPC.exe";
::ShellExecute(NULL,"OPEN",str,NULL, strModulePath, SW_SHOW);
}
//*/
return CallNextHookEx(hLLKeyboardHook,nCode,wParam,lParam);
}CHookClass::CHookClass()
{
hLLKeyboardHook = NULL;
m_bHooked = FALSE;
}CHookClass::~CHookClass()
{
}BOOL CHookClass::StartHook()
{
if(this->m_bHooked) return FALSE;
SetKeyboardFilterHook(TRUE);
this->m_bHooked = TRUE;
return TRUE;
}BOOL CHookClass::StopHook()
{
if(!this->m_bHooked ) return FALSE;
SetKeyboardFilterHook(FALSE);
this->m_bHooked = FALSE;
return TRUE;
}
// Routine to start and stop local keyboard message filtering
BOOL CHookClass::SetKeyboardFilterHook(BOOL activate)
{
if (activate)
{
if (hLLKeyboardHook == NULL)
{
// Start up the hook...
hLLKeyboardHook = ::SetWindowsHookEx(
WH_KEYBOARD, // Hook in before msg reaches app
(HOOKPROC) LowLevelKeyboardFilterProc, // Hook procedure
hInst, // This DLL instance
0 // Hook in to all apps
);
if (hLLKeyboardHook == NULL)
return FALSE;
}
return TRUE;
}
else
{
if (hLLKeyboardHook != NULL)
{
// Stop the hook...
if (!::UnhookWindowsHookEx(hLLKeyboardHook))
return FALSE;
hLLKeyboardHook = NULL;
}
return TRUE;
}
}