2

次のコードを使用して、タスクバーから非表示にします...

private const int SW_HIDE = 0x00;
private const int SW_SHOW = 0x05;
private const int WS_EX_APPWINDOW = 0x40000;
private const int GWL_EXSTYLE = -0x14;
private const int WS_EX_TOOLWINDOW = 0x0080;

[DllImport("User32.dll")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("User32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
bool isShow = true;
private void toggle(Process p)
{
    if (isShow)
    {
        isShow = false;
        SetWindowLong(p.MainWindowHandle, GWL_EXSTYLE, WS_EX_APPWINDOW);
        ShowWindow(p.MainWindowHandle, SW_SHOW);
        ShowWindow(p.MainWindowHandle, SW_HIDE);
        //Hide: working

    }
    else
    {
        isShow = true;
        SetWindowLong(p.MainWindowHandle, GWL_EXSTYLE, WS_EX_APPWINDOW);
        ShowWindow(p.MainWindowHandle, SW_HIDE);
        ShowWindow(p.MainWindowHandle, SW_SHOW);
        //Show: not working
    }
}

しかし、タスクバーにプログラムを再度表示したいのですが、その方法を知っている人はいますか?

4

1 に答える 1

4

SetWindowLongパラメータを使用して呼び出すことでWS_EX_APPWINDOW、フラグを設定または削除するのではなく、拡張スタイルを完全に に置き換えますWS_EX_APPWINDOW。他の拡張スタイルを使用していないため、気付かない場合があります。

スタイル フラグを追加する正しい方法SetWindowLongは次のとおりです。

SetWindowLong(p.MainWindowHandle, GWL_EXSTYLE, 
    GetWindowLong(p.MainWindowHandle, GWL_EXSTYLE) | WS_EX_APPWINDOW);

フラグを削除する正しい方法は次のとおりです。

SetWindowLong(p.MainWindowHandle, GWL_EXSTYLE, 
    GetWindowLong(p.MainWindowHandle, GWL_EXSTYLE) & ~WS_EX_APPWINDOW);

ビット演算について読んで、それが正しい方法である理由を理解してください。

ちなみに、タスクバーからウィンドウを隠す方法はかなり悪いです。まずWS_EX_APPWINDOW、タスク バーからボタンを非表示にするだけでなく、ウィンドウの境界線のスタイルも変更します。また、正当な理由もなく、ウィンドウを非表示にして再表示しています。

タスク バーからボタンを非表示にする正しい方法は、ITaskbarList::DeleteTab メソッドを使用することです。

于 2013-10-28T07:29:11.860 に答える