我已经使用GetWindowLong(或GetWindowLongPtr,如果是64位)和SetWindowLong(或SetWindowLongPtr)在许多窗口中禁用了系统菜单按钮并取得了巨大成功。我有一个启动Internet Explorer的Citrix会话,我无法从标题栏中删除这些项目。我知道我正在使用的方法正在运行,因为当正常的非Citrix Internet Explorer打开时,我可以做我想做的事情。我成功获得Citrix IE会话的窗口句柄,因为我可以集中精力,将其设置为最顶层等。它只是不想使用Get / SetWindowLong,显然与Citrix有关。忽略属性参数 - 我最终将传递用于操作窗口的WS_,但我只想保持简单,直到我开始工作(如果可能的话)。
[DllImport("user32.dll")]
internal extern static long SetWindowLong(int hwnd, int index, long value);
[DllImport("user32.dll")]
internal extern static long GetWindowLong(int hwnd, int index);
public static void SetWindowAttribute(int hwnd, int attribute)
{
IntPtr hwndPtr = new IntPtr(hwnd);
const int GWL_STYLE = -16;
const long WS_MINIMIZEBOX = 0x00020000L;
const long WS_MAXIMIZEBOX = 0x00010000L;
long value = GetWindowLong(hwnd, GWL_STYLE);
Trace.TraceInformation("GetWindowLong value {0}", value.ToString());
long ret = SetWindowLong(hwnd, GWL_STYLE, (value & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX));
Trace.TraceInformation("SetWindowLong reg {0}", ret.ToString());
}
答案 0 :(得分:0)
如果上面的代码是针对32位的,那么在SetWindowLong
声明中,value
参数类型应为int
,而不是long
。这可能会导致一些不一致的行为。
作为参考,这里是System.Windows.Forms内部定义的32位签名:
[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "SetWindowLong")]
public static extern IntPtr SetWindowLongPtr32(HandleRef hWnd, int nIndex, HandleRef dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "GetWindowLong")]
public static extern IntPtr GetWindowLong32(HandleRef hWnd, int nIndex);
此外,使用Spy ++,您可以在修改样式之前和之后验证IE窗口中的样式。