【发布时间】:2017-03-16 08:46:43
【问题描述】:
我目前有一个窗口句柄的IntPtr,我尝试使用HwndSource.FromHwnd 获取它的Window,但它返回null。如果检索到Window 元素,则可以设置其MaxWidth 属性。
是否有其他方法可以仅通过拥有外部应用程序的窗口句柄来设置最大宽度?
编辑: 试图查看RbMm 的方法是否有效。问题标记为 C#,但使用 C++ 自定义 DLL 可能值得一试:
bool InitializeMaxWidthHook(int threadID, HWND destination)
{
if (g_appInstance == NULL)
{
return false;
}
SetProp(GetDesktopWindow(), "WILSON_HOOK_HCBT_MINMAX", destination);
hookMaxWidth = SetWindowsHookEx(WH_CBT, (HOOKPROC)MinMaxHookCallback, g_appInstance, threadID);
return hookMaxWidth != NULL;
}
void UninitializeMaxWidthHook()
{
if (hookMaxWidth != NULL)
UnhookWindowsHookEx(hookMaxWidth);
hookMaxWidth = NULL;
}
static LRESULT CALLBACK MinMaxHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if (code >= 0)
{
UINT msg = 0;
if (code == HCBT_MINMAX)
msg = RegisterWindowMessage("WILSON_HOOK_HCBT_MINMAX");
HWND dstWnd = (HWND)GetProp(GetDesktopWindow(), "WILSON_HOOK_HCBT_MINMAX");
if (msg != 0)
SendNotifyMessage(dstWnd, msg, wparam, lparam);
}
return CallNextHookEx(hookMaxWidth, code, wparam, lparam);
}
我会在修改后再次更新问题。
【问题讨论】:
-
窗口没有任何
MaxWidth属性。窗口过程处理WM_GETMINMAXINFO消息并在MINMAXINFO中返回ptMaxSize- 所以只有控制窗口过程的方法 -
可能的方法 - 设置
WH_CALLWNDPROCRET- 实现 CallWndRetProc 回调函数并更改MINMAXINFO结构 -
另一种方法是监视(轮询)窗口大小和resize it,当它太大时。
-
RbMm 的解决方案不起作用,它需要将代码注入拥有窗口的进程中,并且不能是 C# 代码。使用 System.Windows.Automation 命名空间或 SetWinEventHook() 来监视大小变化几乎是最实用的。
-
@Hans 是的,标签实际上是用于 C# 的。在检查自定义 DLL 之后,我一定会尝试您的方法。
标签: c# windows window-handles