挂钩Win32窗口创建/调整大小/查询大小

Eli*_*sha 3 c c++ hook winapi setwindowshookex

我正试图"拉伸"现有的应用程序.

目标是在不更改该应用程序的代码的情况下使现有应用程序变得更大.
cosntraint是拉伸的应用程序不会"注意"它,因此如果应用程序查询创建的窗口大小,它将看到原始大小而不是调整大小.

我设法使用SetWindowsHookEx以下方法调整窗口大小:

HHOOK hMessHook = SetWindowsHookEx(WH_CBT,CBTProc, hInst, 0);
Run Code Online (Sandbox Code Playgroud)

和:

LRESULT CALLBACK CBTProc( __in  int nCode,
                          __in  WPARAM wParam, 
                          __in  LPARAM lParam)
{
   if (HCBT_CREATEWND == nCode)
   {
      CBT_CREATEWND *WndData = (CBT_CREATEWND*) lParam;
      // Calculate newWidth and newHeight values...
      WndData->lpcs->cx = newWidth;
      WndData->lpcs->cy = newHeight;
   }

   CallNextHookEx(hMessHook, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,我无法让拉伸的应用程序看到原始大小.

例如,如果创建了.NET表单:

public class SimpleForm : Form
{
    public SimpleForm()
    {
        Width = 100;
        Height = 200;
    }
}
Run Code Online (Sandbox Code Playgroud)

稍后查询大小:

void QuerySize(SimpleForm form)
{
   int width = form.Width;
   int height = form.Height;
}
Run Code Online (Sandbox Code Playgroud)

我想widthheight100200,而不是调整值.我无法找到查询现有窗口大小的右钩子.

挂钩窗口大小查询的正确方法是什么?

cas*_*nca 7

不幸的是,窗口大小的查询不是由消息处理的 - 它们是直接的API调用,例如GetWindowRect- 因此它们不能被标准Windows挂钩拦截.您可能需要查看Detours API,它允许您挂钩任意Win32函数.(你可以在这里找到关于Detours的教程)