【问题标题】:prohibit to move window with some title禁止移动带有某些标题的窗口
【发布时间】:2012-01-06 21:32:28
【问题描述】:

我需要禁止带有某些标题的窗口移动。 // Hooks.cpp : 定义 DLL 应用程序的导出函数。 //

#include "stdafx.h"

extern "C" __declspec(dllexport) TCHAR s[50];
extern "C" __declspec(dllexport) HHOOK hHook;
extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}

TCHAR s[50];
HHOOK hHook;

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//   HDC hdc;
if (nCode < 0)  
    return CallNextHookEx(hHook, nCode, wParam, lParam);

//  hdc = GetDC(hWnd);
CBT_CREATEWND* cbt=(CBT_CREATEWND*)lParam;
if (nCode==HCBT_MOVESIZE)
    if (!lstrcmp(s,cbt->lpcs->lpszName)) return 1; 
return CallNextHookEx(hHook, nCode, wParam, lParam); 
return 0; 
} 

但是当我移动窗口时出现错误。当我改变它的位置时它改变了,但是我得到了错误 - 在模块 Hooks.dll(我的 dll)中的地址 67471040 的访问冲突。读取地址 00000116

【问题讨论】:

  • 你是如何初始化's'的?钩子 DLL 分别加载到每个进程中,因此您不能只在主进程中设置“s”,您必须将值单独传达给每个 DLL 实例,可能使用某种共享内存。我的猜测是这里的 s 未初始化,并且由于这个原因在 lstrcmp 中发生了错误。
  • 这是对任何人都无济于事的问题的缩影;由于过于本地化,投票结束。 OP,您只需使用调试器即可解决此问题。
  • 如果您认为s 是问题所在,为什么不在实际的 Hook 回调中声明并初始化它,看看是否能解决问题

标签: c winapi hook


【解决方案1】:

您将lParam 转换为指向CBT_CREATEWND 的指针,但只有nCode==HCBT_CREATEWND 才会如此,显然情况并非如此。当nCode==HCBT_MOVESIZE 时,lParam 指向一个RECT 结构。

您应该首先处理HCBT_CREATEWND,将其过滤并保存相关的HWND,以便在HCBT_MOVESIZE发生时产生条件。 但是,如果窗口更改标题,这将不起作用。

顺便说一句,你不能直接调用GetWindowText() 来获取窗口标题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2011-07-27
    • 2013-04-20
    • 1970-01-01
    • 2014-01-10
    • 2015-08-19
    • 2021-07-12
    • 2020-07-12
    相关资源
    最近更新 更多