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