我不确定问题是什么,我正在注册一个钩子并遵循文档。我已经读完了所有内容,但由于某些原因它无法正常工作。它将告诉我挂钩已安装,但随后它将永远不会被调用。
我使用的代码如下:
#include <Windows.h>
#include <wchar.h>
HHOOK hHook;
LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam)
{
wprintf( TEXT("ShellProc called with iCode: %d\r\n"), nCode );
if( nCode == HSHELL_WINDOWCREATED )
{
HWND hWnd = (HWND)wParam;
wprintf( TEXT("New window created: %d\r\n"), hWnd );
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int main()
{
hHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellProc, NULL, GetCurrentThreadId());
if( hHook == NULL )
{
wprintf( TEXT("Failed to set windows hook\r\n") );
}
else
{
wprintf( TEXT("Windows hook set.\r\n") );
MINIMIZEDMETRICS st;
st.cbSize = sizeof(MINIMIZEDMETRICS);
st.iArrange = ARW_HIDE;
BOOL ret;
ret = SystemParametersInfo(
SPI_SETMINIMIZEDMETRICS,
sizeof(MINIMIZEDMETRICS),
&st,
0);
}
do
{
Sleep(100);
} while( !GetAsyncKeyState(VK_F5) );
if( hHook != NULL )
UnhookWindowsHookEx(hHook);
return 0;
}
答案 0 :(得分:3)
您只是将挂钩安装到调用线程中,然后该线程没有执行任何会导致调用挂钩的操作。 Read the documentation:
当shell应用程序即将被激活以及创建或销毁顶级窗口时,系统调用WH_SHELL挂钩过程
你没有做任何事情。
另外,除非您的应用程序旨在将Explorer.exe替换为用于管理Windows桌面的已注册Shell应用程序,否则您不应该调用SystemParametersInfo(SPI_SETMINIMIZEDMETRICS)
。