全局键盘钩子有时会失效的问题!
如题:
有一C++写的DLL,用于实现全局键盘钩子,在C#程序中对其进行调用,安装的时候没有问题并且钩子可以正常使用,但过一段时间之后,钩子就可能失去作用了。郁闷中,下面是部分代码:
DLL钩子代码如下:C/C++ code
#include ...
//share global variable during different process
#pragma data_seg ("sharedsec")
static HHOOK g_HookPart=NULL;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:sharedsec,RWS")
void Log_Message(TCHAR *fmt,...); //save log
LRESULT CALLBACK KeyHandler(int code, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *Key = (KBDLLHOOKSTRUCT *)lParam;
if (code == HC_ACTION)
{
Log_Message(_T("Flag: %X\t Key Scancode: %X\t Vkcode: %X"), Key->flags, Key->scanCode ,Key->vkCode);
if (0xab == Key->scanCode)
{
//do something
return 1;
}
}
return CallNextHookEx(g_HookPart, code, wParam, lParam);
}
bool InstallHook()
{
g_HookPart = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHandler,::GetModuleHandle (NULL),0);
if (g_HookPart)
return true;
else
return false;
}
bool UninstallHook()
{
if (UnhookWindowsHookEx(g_HookPart))
return true;
else
return false;
}
void Log_Message(TCHAR *fmt,...)
{
/******Set log file path and log file name*******/
TCHAR CurrentDir[256];
TCHAR LogFile[256];
TCHAR *EndChar = NULL;
memset(CurrentDir, 0, sizeof(CurrentDir));
memset(LogFile, 0, sizeof(LogFile));
//Get Current process's full path
if (::GetModuleFileName(::GetModuleHandle(NULL), CurrentDir, sizeof(CurrentDir)) == 0)
{
//Log_Message(_T("Get service path fail"), true);
return;
}
//Get current process's directory
EndChar = strrchr(CurrentDir, _T('\\'));
if (EndChar)
EndChar[1] = 0;
int copied = 0;
strcpy_s(LogFile, sizeof(LogFile) / sizeof (TCHAR), CurrentDir);
_tcscat_s(LogFile, _T("VolHandler.log"));
/************************************/
FILE *fp = NULL;
TCHAR DateTime[25];
TCHAR Time[10];
_tstrdate_s(DateTime);
_tstrtime_s(Time);
_tcscat_s(DateTime, _T("&&"));
_tcscat_s(DateTime, Time);
if (!strcmp(_T(""), fmt))
{
if (_tfopen_s(&fp, LogFile, _T("w")))
{
return;
}
}
else
{
if (_tfopen_s(&fp, LogFile, _T("a")))
{
return;
}
fprintf(fp, _T("%s: "),DateTime);
}
va_list ap; /* points to each unnamed arg in turn */
TCHAR *p, *sval;
int ival;
va_start(ap, fmt); /* make ap point to 1st unnamed arg */
for (p = fmt; *p; p++)
{
if (*p != '%')
{
fprintf(fp, _T("%c"), *p);
continue;
}
switch (*++p)
{
case 'd':
ival = va_arg(ap, int);
fprintf(fp, _T("%d"), ival);
break;
case 's':
for (sval = va_arg(ap, char *); *sval; sval++)
fprintf(fp, _T("%c"), *sval);
break;
case 'x':
ival = va_arg(ap, int);
fprintf(fp, _T("%x"), ival);
break;
case 'X':
ival = va_arg(ap, int);
fprintf(fp, _T("%X"), ival);
break;
default:
fprintf(fp, _T("%c"), *p);
break;
}
}
va_end(ap); /* clean up when done */
fprintf(fp, _T("\n"));
fflush(fp);
fclose(fp);
}
在C#中调用时,先导入引用:
C# code[DllImport("KeyboardHook.dll")]
public static extern bool InstallHook();
然后在窗口初始化的时候调用InstallHook安装钩子。
请各位大侠帮忙看下可能会是什么原因?
非常感谢!