我正在使用此代码(在Windows 2003上)删除窗口并调整其大小:
Process process = Process.GetProcessById(12121);
IntPtr mwh = process.MainWindowHandle;
SetWindowLong(mwh, GWL_STYLE, WS_VISIBLE);
ShowWindowAsync(mwh, 3);
SetWindowPos(mwh, new IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
并声明: [的DllImport(" USER32.DLL&#34)] private static extern bool ShowWindowAsync(IntPtr hWnd,int nCmdShow);
[DllImport("USER32.DLL")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
static readonly int GWL_STYLE = -16;
static readonly int SWP_NOMOVE = 0x2;
static readonly int SWP_NOSIZE = 0x1;
static readonly int SWP_FRAMECHANGED = 0x20;
static readonly int WS_VISIBLE = 0x10000000;
当我调整与我启动的进程关联的窗口时,一切正常。但是,当我想与其他用户窗口这样做时,它什么都不做。 如何让它适用于其他用户的窗口?
答案 0 :(得分:0)
由于用户界面权限隔离(UIPI),此行为是在Windows Vista及更高版本中设计的。如果您可以访问受控应用程序的源代码,则可以解决此问题。
请阅读此答案以获取更多信息:https://stackoverflow.com/a/15445510。
答案 1 :(得分:0)
process.MainWindowHandle是一个.NET概念,在本机桌面应用程序中没有主窗口这样的东西,因此可能无法在其他进程上正常工作。您应该检查mwh是否为IntPtr.Zero,如果是,则需要使用EnumWindows
+ GetWindowThreadProcessId
+ IsWindowVisible
来查找应用程序窗口。
在您未创建的窗口上调用SetWindowLong(mwh, GWL_STYLE, WS_VISIBLE);
不正常。您需要首先调用GetWindowLong
获取现有样式remove all the styles you don't want并添加WS_POPUP。您可能还想删除一些扩展样式。