禁用在Citrix实例中打开的ie浏览器中的最小化按钮

本文关键字:ie 浏览器 按钮 最小化 Citrix 实例 | 更新日期: 2023-09-27 18:15:01

我已经禁用了系统菜单按钮在过去的许多窗口使用GetWindowLong(或GetWindowLongPtr如果64位)和SetWindowLong(或SetWindowLongPtr)取得了巨大的成功。我有一个Citrix会话,启动了ie浏览器,我无法从标题栏中删除这些项目。我知道我正在使用的方法是有效的,因为我可以做我想做的事,当一个正常的,非思杰,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());
}

禁用在Citrix实例中打开的ie浏览器中的最小化按钮

如果上面的代码是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窗口上的样式