使用Python WinAPI SetWindowsHookExA的WH_SHELL

使用Python WinAPI SetWindowsHookExA的WH_SHELL,python,windows,winapi,hook,pywin32,Python,Windows,Winapi,Hook,Pywin32,我一直在尝试通过Python WinAPI使用SetWindowsHookxa设置一个钩子,以便在创建和销毁windows时获取有关windows的信息 我对Win32 API不是很有经验,关于钩子更是如此,我在上面找到的大多数文档、问题和示例都是关于鼠标和键盘钩子的 我已经尝试了很多事情,我记得下面列出了一些事情: #非预期最终行为 def挂接程序(nCode、wParam、lParam): 如果(nCode==1): 打印(“已创建”) elif(nCode==2): 打印(“已销毁”) 其

我一直在尝试通过Python WinAPI使用SetWindowsHookxa设置一个钩子,以便在创建和销毁windows时获取有关windows的信息
我对Win32 API不是很有经验,关于钩子更是如此,我在上面找到的大多数文档、问题和示例都是关于鼠标和键盘钩子的
我已经尝试了很多事情,我记得下面列出了一些事情:

#非预期最终行为
def挂接程序(nCode、wParam、lParam):
如果(nCode==1):
打印(“已创建”)
elif(nCode==2):
打印(“已销毁”)
其他:
返回
打印(GetWindowText(wParam))
HOOKPROC=WINFUNCTYPE(HRESULT、c_int、wintypes.WPARAM、wintypes.LPARAM)
CMPFUNC=CFUNCTYPE(c_int,c_int,c_int,指针(c_void_p))
#尝试值
HPPROCEDURE=挂钩程序(挂钩程序)
hProcedure=CMPFUNC(hookProcedure)
#尝试值
mHandle=0
mHandle=GetModuleHandle(无)
mHandle=kernel32.GetModuleHandleA(“shell32”)
mHandle=kernel32.LoadLibraryA(“shell32”)
mHandle=无
user32.SetWindowsHookExA(WH_SHELL,hProcedure,mHandle,0)

只有当代码位于DLL(可以加载到其他进程)中时,挂钩才能在自己的线程之外工作。这在Python中可能有问题。这可能是更容易写在C++中的这个部分,并从你的Python程序调用它。正如CherryDT所说,你需要把钩子加载到DLL中,这样它就可以在你自己的线程之外工作。你可以参考:我明白了,我会研究的,谢谢。