全局键盘钩子有时会失效的问题!

nostopping nostopping 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如题:
有一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安装钩子。

请各位大侠帮忙看下可能会是什么原因?
非常感谢!
...全文

相关推荐

评论 14
收藏 已收藏
分享
返回顶部
nostopping
进程/线程/DLL 15,466 成员 49,169 内容