C# 是否可以设置另一个应用程序';s窗口';它的窗口句柄的最大宽度是多少?
我目前有一个窗口句柄的C# 是否可以设置另一个应用程序';s窗口';它的窗口句柄的最大宽度是多少?,c#,windows,window-handles,C#,Windows,Window Handles,我目前有一个窗口句柄的IntPtr,我尝试使用获取它的窗口,但它返回null。如果检索到窗口元素,则可以设置其MaxWidth属性 是否有其他方法可以通过使用外部应用程序的窗口句柄来设置最大宽度 编辑: 试着看看他的方法是否有效。这个问题标记了C++,但是这可以是一个值得一试的C++自定义DLL: bool InitializeMaxWidthHook(int threadID, HWND destination) { if (g_appInstance == NULL) {
IntPtr
,我尝试使用获取它的窗口
,但它返回null
。如果检索到窗口
元素,则可以设置其MaxWidth
属性
是否有其他方法可以通过使用外部应用程序的窗口句柄来设置最大宽度
编辑:
试着看看他的方法是否有效。这个问题标记了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);
}
修改后,我将再次更新问题。我提出的解决方案不完全是C#,因此这并不完全符合问题标签,但我还是会发布它
我为WndProc
hook创建了一个第三方DLL,其中包含初始化函数,用于侦听GETMINMAXINFO
(出于隐私考虑,我删除了部分代码,但这是用于GETMINMAXINFO
:
#include "stdafx.h"
#include <windows.h>
HINSTANCE g_appInstance = NULL;
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l);
HHOOK hookWndProc = NULL;
static LRESULT CALLBACK WndProcHookCallback(int code, WPARAM wparam, LPARAM lparam);
bool InitializeWndProcHook(int threadID, HWND destination)
{
if (g_appInstance == NULL)
{
return false;
}
SetProp(GetDesktopWindow(), "WILSON_HOOK_HWND_WND_PROC", destination);
hookWndProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProcHookCallback, g_appInstance, threadID);
return hookWndProc != NULL;
}
void UninitializeWndProcHook()
{
if (hookWndProc != NULL)
UnhookWindowsHookEx(hookWndProc);
hookWndProc = NULL;
}
static LRESULT CALLBACK WndProcHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if (code >= 0)
{
UINT msg = 0;
WPARAM newWPARAM;
LPARAM newLPARAM;
if (code == HC_ACTION)
{
CWPSTRUCT *wndProc = (CWPSTRUCT *)lparam;
if (shouldSendMessageOnWindow(wndProc->hwnd))
{
// if the message is from other process, the value of wparam is null
UINT wndProcMessage = wndProc->message;
if (wndProcMessage == WM_GETMINMAXINFO)
{
newWPARAM = (WPARAM)wndProc->hwnd;
newLPARAM = (LPARAM)wndProc->lParam;
msg = RegisterWindowMessage("WILSON_HOOK_HC_ACTION_WND_PROC_WM_GETMINMAXINFO");
}
}
}
if (msg != 0)
{
HWND dstWnd = (HWND)GetProp(GetDesktopWindow(), "WILSON_HOOK_HWND_WND_PROC");
SendNotifyMessage(dstWnd, msg, newWPARAM, newLPARAM);
}
}
return CallNextHookEx(hookWndProc, code, wparam, lparam);
}
这适用于某些应用程序(我认为仅适用于Win32应用程序)。某些应用程序(如Metro应用程序和可能的Java应用程序)无法访问。
但就目前而言,这对初学者来说可能是个好消息
感谢并指导我回答这个问题。窗口没有任何MaxWidth
属性。窗口过程处理消息并返回ptMaxSize
in-所以唯一的方法是控制窗口过程可能的方法-设置-实现CallWndRetProc回调函数并更改MINMAXINFO
结构另一种方法h将监视(轮询)窗口大小,当它太大时。RbMm的解决方案无法工作,它需要向拥有窗口的进程中注入代码,而该进程不能是C#代码。使用System.Windows.Automation命名空间或SetWinEventHook()监视大小的变化是非常实际的。@Hans是的,标记实际上是C#的。在检查自定义DLL后,我一定会尝试你的方法。
private struct POINT
{
public int x;
public int y;
}
private struct MINMAXINFO
{
public POINT ptReserved;
public POINT ptMaxSize;
public POINT ptMaxPosition;
public POINT ptMinTrackSize;
public POINT ptMaxTrackSize;
}
/**Other Code**/
MINMAXINFO* minMaxInfo = (MINMAXINFO*) lParam;
int currentMaxSize = minMaxInfo->ptMaxSize.x;
Debug.WriteLine("Updated max" + currentMaxSize);
minMaxInfo->ptMaxSize.x = screenWidth;
minMaxInfo->ptMaxSize.y = screenHeight;
User32.SetWindowPos(wParam, User32.SpecialWindowHandles.HWND_TOP, 0, 0, screenWidth, screenHeight, User32.SetWindowPosFlags.SWP_DRAWFRAME | User32.SetWindowPosFlags.SWP_ASYNCWINDOWPOS);
/**Other Code**/