在Citrix实例中打开的Internet Explorer中禁用最小化按钮

时间:2013-05-24 02:39:29

标签: c# internet-explorer citrix

我已经使用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());

}

1 个答案:

答案 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窗口中的样式。