0

GetWindowLong (または 64 ビットの場合は GetWindowLongPtr) と 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 に答える