两个问题。

1)我知道这一定是一个预期的结果,但也许有人可以告诉我我在做什么错;我正在尝试在全局挂钩中为所有窗口类子类子类,除了我无法像应该关闭商店一样,该程序最初注册钩子unremisters undisters the Hook and Exits,sublass分类的应用程序开始崩溃。

这是我想做的。

// stores original wndprocs. In the hook dll, outside the shared memory.
map<HWND, WNDPROC> origWndProcs;

// in an EnumWindows callback, executed for all HWND's, also in the hook dll (UWM_REMOVE_HOOK is a registered unique message)
SendMessageTimeout(hWnd, UWM_REMOVE_HOOK, 0, 0, SMTO_ABORTIFHUNG | SMTO_NORMAL, 15000, res);

// Still in the same hook, in the subclassing wndproc..
if (msg == UWM_REMOVE_HOOK) {
   if (origWndProcs.find(hwnd) != origWndProcs.end()) {
      SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)origWndProcs[hwnd]);
   }
}

// clears the hook..
__declspec(dllexport) BOOL ClearHooks(HWND hWnd) {

    BOOL unhooked = UnhookWindowsHookEx(hook) &&
       UnhookWindowsHookEx(kb_hook) &&
       UnhookWindowsHookEx(mouse_hook) && 
       UnhookWindowsHookEx(cbt_hook);

    if(unhooked)
       hWndServer = NULL;
    return unhooked;
}

在dllmain中,我在dll_process_detach上不做任何事情。取而代之的是,ClearHooks()是从最初注册钩子的程序中调用的,并且仅在挂钩发送消息发出的消息表明它已执行Enmumwindows操作后才在此调用(还原原始WNDProcs,请参见上文)。

我在wndproc挂钩中为窗口子窗口;所有收到一条消息的可见窗口,其当前WNDProc不是DLL中的窗口。

基本上,尽管Windows似乎确实将WNDProc设置为更换时,但所有(据我所知)的应用程序崩溃了。有人知道我可能做错了什么?

2)我需要拦截WM_MINMAXINFO并在最大化窗口时修改窗口最大化。不幸的是,我无法在DLL中这样做,但是我必须与程序交谈以获取尺寸信息。因此,与该窗口交谈的最佳方法是什么?我需要它传递一些信息,以便可以修改原始WM_MINMAXINFO消息随附的结构。 WM_COPYDATA中的结构是否会保留其数据,直到拨打sendmessagetime Out返回?

谢谢

有帮助吗?

解决方案

这里有很多疼痛点。您假设没有其他代码会亚插入窗口。并且这样的代码将以正确的顺序取消划分。没有正确的顺序,与程序的执行相比,您的挂钩完全不同步。

但是,解决方法很简单。您已经与SetWindowShookex挂钩了,不妨再做一个。 wh_callwndproc或wh_callwndprocret,具体取决于您想做的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top