0

过去,我使用 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());

}
4

1 回答 1

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 窗口上的样式。

于 2013-07-26T23:08:28.753 回答