vc 窗体隐藏的情况下不能hook键盘

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc 窗体隐藏的情况下不能hook键盘相关的知识,希望对你有一定的参考价值。

我用的是VS2010里面的VC,我写了一个DLL,代码如下:
//cpp文件:
#include<Windows.h>
HWND Dll_hWindow=NULL;
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)

switch(wParam)

case VK_F1:
if(!(lParam&0x40000000))

ShowWindow(Dll_hWindow,SW_HIDE);

break;
case VK_F2:
if(!(lParam&0x40000000))

ShowWindow(Dll_hWindow,SW_SHOW);

break;

return 0;

HHOOK SetHook(HWND _hWindow)

Dll_hWindow=_hWindow;
return SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook.dll"),0);

//def文件:
LIBRARY Hook
EXPORTS
SetHook
使用DLL来监测键盘按键,如果按F1,则隐藏窗口,如果按F2,则显示窗口。
程序的cpp文件:
#include<Windows.h>
HHOOK hHook=NULL;
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam)

switch(uMsg)

case WM_CLOSE:
DestroyWindow(hwnd);
PostQuitMessage(0);
UnhookWindowsHookEx(hHook);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);

return 0;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

WNDCLASS appclass;
appclass.cbClsExtra =0;
appclass.cbWndExtra =0;
appclass.hbrBackground =HBRUSH(COLOR_WINDOW);
appclass.hCursor =LoadCursor(NULL,MAKEINTRESOURCE(IDC_APPSTARTING));
appclass.hIcon =LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION));
appclass.hInstance =hInstance;
appclass.lpfnWndProc =WindowProc;
appclass.lpszClassName ="app";
appclass.lpszMenuName =NULL;
appclass.style =CS_HREDRAW | CS_VREDRAW;
RegisterClass(&appclass);
RECT rDesktop;
GetWindowRect(GetDesktopWindow(),&rDesktop);
int x=rDesktop.right /2-250,y=rDesktop.bottom /2-150;
HWND hWindow=CreateWindow("app","旭迅一键隐藏",WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE,x,y,500,300,NULL,NULL,hInstance,NULL);
UpdateWindow(hWindow);
typedef HHOOK(*_SetHook)(HWND);
_SetHook SetHook=_SetHook(GetProcAddress(LoadLibrary("Hook.dll"),"SetHook"));
hHook=SetHook(hWindow);
MSG mWindow;
while(GetMessage(&mWindow,NULL,0,0))

TranslateMessage(&mWindow);
DispatchMessage(&mWindow);


问题是我按了F1能隐藏窗口,但按F2就不能显示窗口了,请问这是怎么回事?

看样子 这个dll是会被系统在另外的进程空间加载的。重新加载的时候 HWND Dll_hWindow 会被重新制为NULL了。 所以你在 KeyboardProc 里面重新 Findwindow 或者其他办法得到窗体hwnd才行。 或者你用其他进程共享的办法共享 hwnd出来。

其实如果你只是注册热键的话,可以考虑使用 RegisterHotKey 这个api。你这种办法不但可能和其他热键冲突,也会影响系统性能。
参考技术A 使用全局钩子

以上是关于vc 窗体隐藏的情况下不能hook键盘的主要内容,如果未能解决你的问题,请参考以下文章

VC 窗体隐藏问题

如何在不单击后退按钮的情况下隐藏键盘[重复]

如何使用JavaScript捕获iOS上的隐藏键盘事件

linux进程隐藏 hook readdir函数 挂载覆盖/proc/pid 目

如何在不关闭对话框的情况下使用 Appium for IOS 隐藏键盘?

是否可以在不隐藏键盘的情况下使 UITextView 处于非活动状态(可编辑 = 否)?