9

基本的に、タスクバーを通常モードの場合は自動非表示モードに設定する(逆に、自動非表示の場合は通常の表示モードに設定する)単純なトグルプログラム(キーボードショートカットにマップされます)を作成します。

C#で実装する方法を知っていますか?(またはWin32 C ++ですが、実際にそれを実行するものはすべて問題ありません。)

ありがとう。私が自分自身を明確にしたことを願っています。

-

タスクバーと重なるフルスクリーンアプリは本当に必要ありません。表示モードを切り替えて終了するウィンドウのないプログラムだけが必要です。定期的に自動非表示から通常表示に切り替えて、簡略化したいと思います。(Win7を使用します。)

-

編集しました。例えば

#include <windows.h>

int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    SetWindowPos(FindWindow(L"Shell_traywnd", NULL ), 0, 0, 0, 0, 0, 0x40);
}

トリックは実行されません。タスクバーのみが表示されます。タスクバーはすでに表示されています=trueですが、自動非表示に切り替えたり、自動非表示から切り替えたりすることはできません。(0x80にも同じことが当てはまります。)

4

7 に答える 7

17

私が使用する関数は次のとおりです。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string strClassName, string strWindowName);

[DllImport("shell32.dll")]
public static extern UInt32 SHAppBarMessage(UInt32 dwMessage, ref APPBARDATA pData);

public enum AppBarMessages
{
    New              = 0x00,
    Remove           = 0x01,
    QueryPos         = 0x02,
    SetPos           = 0x03,
    GetState         = 0x04,
    GetTaskBarPos    = 0x05,
    Activate         = 0x06,
    GetAutoHideBar   = 0x07,
    SetAutoHideBar   = 0x08,
    WindowPosChanged = 0x09,
    SetState         = 0x0a
}

[StructLayout(LayoutKind.Sequential)]
public struct APPBARDATA
{
    public UInt32 cbSize;
    public IntPtr hWnd;
    public UInt32 uCallbackMessage;
    public UInt32 uEdge;
    public Rectangle rc;
    public Int32 lParam;
}

public enum AppBarStates
{
    AutoHide    = 0x01,
    AlwaysOnTop = 0x02
}

/// <summary>
/// Set the Taskbar State option
/// </summary>
/// <param name="option">AppBarState to activate</param>
public void SetTaskbarState(AppBarStates option)
{
    APPBARDATA msgData = new APPBARDATA();
    msgData.cbSize = (UInt32)Marshal.SizeOf(msgData);
    msgData.hWnd = FindWindow("System_TrayWnd", null);
    msgData.lParam = (Int32)(option);
    SHAppBarMessage((UInt32)AppBarMessages.SetState, ref msgData);
}

/// <summary>
/// Gets the current Taskbar state
/// </summary>
/// <returns>current Taskbar state</returns>
public AppBarStates GetTaskbarState()
{
    APPBARDATA msgData = new APPBARDATA();
    msgData.cbSize = (UInt32)Marshal.SizeOf(msgData);
    msgData.hWnd = FindWindow("System_TrayWnd", null);
    return (AppBarStates)SHAppBarMessage((UInt32)AppBarMessages.GetState, ref msgData);
}

上記のコードが実装されたら、タスクバーを次の方法で自動非表示に設定するだけです。SetTaskbarState(AppBarStates.AutoHide);

次の方法で現在の状態を取得します。

AppBarStates currentState = GetTaskbarState();
于 2012-12-03T14:18:14.837 に答える
6

@Quispieの回答に従いましたが、最初はWindows 10では機能しませんでしたが、それを解決するための基盤とソース(賞賛)とhttp://www.pinvoke.net/を提供してくれました。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string strClassName, string strWindowName);

[DllImport("shell32.dll")]
public static extern UInt32 SHAppBarMessage(UInt32 dwMessage, ref APPBARDATA pData);

public enum AppBarMessages
{
    New = 0x00,
    Remove = 0x01,
    QueryPos = 0x02,
    SetPos = 0x03,
    GetState = 0x04,
    GetTaskBarPos = 0x05,
    Activate = 0x06,
    GetAutoHideBar = 0x07,
    SetAutoHideBar = 0x08,
    WindowPosChanged = 0x09,
    SetState = 0x0a
}

[StructLayout(LayoutKind.Sequential)]
public struct APPBARDATA
{
    public int cbSize; // initialize this field using: Marshal.SizeOf(typeof(APPBARDATA));
    public IntPtr hWnd;
    public uint uCallbackMessage;
    public uint uEdge;
    public RECT rc;
    public int lParam;
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left, Top, Right, Bottom;

    public RECT(int left, int top, int right, int bottom)
    {
        Left = left;
        Top = top;
        Right = right;
        Bottom = bottom;
    }

    public RECT(System.Drawing.Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom) { }

    public int X
    {
        get { return Left; }
        set { Right -= (Left - value); Left = value; }
    }

    public int Y
    {
        get { return Top; }
        set { Bottom -= (Top - value); Top = value; }
    }

    public int Height
    {
        get { return Bottom - Top; }
        set { Bottom = value + Top; }
    }

    public int Width
    {
        get { return Right - Left; }
        set { Right = value + Left; }
    }

    public System.Drawing.Point Location
    {
        get { return new System.Drawing.Point(Left, Top); }
        set { X = value.X; Y = value.Y; }
    }

    public System.Drawing.Size Size
    {
        get { return new System.Drawing.Size(Width, Height); }
        set { Width = value.Width; Height = value.Height; }
    }

    public static implicit operator System.Drawing.Rectangle(RECT r)
    {
        return new System.Drawing.Rectangle(r.Left, r.Top, r.Width, r.Height);
    }

    public static implicit operator RECT(System.Drawing.Rectangle r)
    {
        return new RECT(r);
    }

    public static bool operator ==(RECT r1, RECT r2)
    {
        return r1.Equals(r2);
    }

    public static bool operator !=(RECT r1, RECT r2)
    {
        return !r1.Equals(r2);
    }

    public bool Equals(RECT r)
    {
        return r.Left == Left && r.Top == Top && r.Right == Right && r.Bottom == Bottom;
    }

    public override bool Equals(object obj)
    {
        if (obj is RECT)
            return Equals((RECT)obj);
        else if (obj is System.Drawing.Rectangle)
            return Equals(new RECT((System.Drawing.Rectangle)obj));
        return false;
    }

    public override int GetHashCode()
    {
        return ((System.Drawing.Rectangle)this).GetHashCode();
    }

    public override string ToString()
    {
        return string.Format(System.Globalization.CultureInfo.CurrentCulture, "{{Left={0},Top={1},Right={2},Bottom={3}}}", Left, Top, Right, Bottom);
    }
}


public enum AppBarStates
{
    AlwaysOnTop = 0x00,
    AutoHide = 0x01
}

/// <summary>
/// Set the Taskbar State option
/// </summary>
/// <param name="option">AppBarState to activate</param>
public void SetTaskbarState(AppBarStates option)
{
    APPBARDATA msgData = new APPBARDATA();
    msgData.cbSize = Marshal.SizeOf(msgData);
    msgData.hWnd = FindWindow("System_TrayWnd", null);
    msgData.lParam = (int)option;
    SHAppBarMessage((UInt32)AppBarMessages.SetState, ref msgData);
}

/// <summary>
/// Gets the current Taskbar state
/// </summary>
/// <returns>current Taskbar state</returns>
public AppBarStates GetTaskbarState()
{
    APPBARDATA msgData = new APPBARDATA();
    msgData.cbSize = Marshal.SizeOf(msgData);
    msgData.hWnd = FindWindow("System_TrayWnd", null);
    return (AppBarStates)SHAppBarMessage((UInt32)AppBarMessages.GetState, ref msgData);
}
于 2016-02-10T15:22:10.427 に答える
3

タスクバーを非表示にする

これは、C#よりもWIN32APIに関連する問題です。これを使用して(もちろんドットネットに変換する必要があります)、タスクバーを非表示にすることができます。

http://www.pinvoke.netを使用して、WIN32API呼び出しをドットネットに変換できます。

自動非表示をタスクバーに設定する

ここで説明するキーを使用してレジストリを操作することで、これを実現できます。

それは簡単な作業になるはずです、頑張ってください。

于 2009-09-04T22:46:20.827 に答える
1

タスクバーはアプリバーであり、 SHAppBarMessageで制御できます。

于 2009-09-05T22:54:19.317 に答える
1

私のように、Googleからここに到着し、Windows 10を使用しているすべての人にとって、@ Quispieと@nicruoからの回答は問題ありませんが、追加が必要ですif

その理由は、クラス名がバージョンごとに異なるためです(明らかに、他のWindowsは10個しかありません)。

msgData.hWnd = FindWindow("System_TrayWnd", null);
if (msgData.hWnd == IntPtr.Zero)
    msgData.hWnd = FindWindow("Shell_TrayWnd", null);
于 2018-11-30T17:17:40.933 に答える
1

VBタスクバーの「表示」と「自動非表示」-Windows10

私はこれをVBに翻訳しましたが、これは他の人にも役立つかもしれません(Windows 10; 32ビットから64ビットで動作するはずです):

    Option Explicit On
    Option Strict On
    Imports System.Runtime.InteropServices

    Module WindowsTaskbarSettings

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Function SHAppBarMessage Lib "shell32.dll" Alias "SHAppBarMessage" (ByVal dwMessage As Integer, ByRef pData As APPBARDATA) As Integer

    'https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shappbarmessage
    'https://docs.microsoft.com/nl-nl/windows/win32/api/shellapi/ns-shellapi-appbardata

    'https://docs.microsoft.com/en-us/windows/win32/shell/abm-getstate 'requires csize to be set
    'https://docs.microsoft.com/en-us/windows/win32/shell/abm-setstate 'requires hwnd and csize to be set

    Structure APPBARDATA
        Dim cbSize As Integer
        Dim hwnd As Long
        Dim uCallbackMessage As Integer '[Delegate]
        Dim uEdge As Integer
        Dim rc As RECT
        Dim lParam As Integer 'message specific, see 
    End Structure

    Structure RECT
        Dim Left As Integer
        Dim Top As Integer
        Dim Right As Integer
        Dim Bottom As Integer
    End Structure

    Public Enum AppBarMessages
        Newx = &H0
        Remove = &H1
        QueryPos = &H2
        SetPos = &H3
        GetState = &H4
        GetTaskBarPos = &H5
        Activate = &H6
        GetAutoHideBar = &H7
        SetAutoHideBar = &H8
        WindowPosChanged = &H9
        SetState = &HA
    End Enum

    Public Enum AppBarStates
        AutoHide = &H1
        AlwaysOnTop = &H2
    End Enum

    Public Sub AutoHide_Toggle()

        If GetTaskbarStateAutoHide() Then
            SetTaskbarState(AppBarStates.AlwaysOnTop)
        Else
            SetTaskbarState(AppBarStates.AutoHide)
        End If
    End Sub

    Public Sub SetTaskbarState(StateOption As AppBarStates)
        'sets the Taskbar State to StateOption (AllwaysOnTop or AutoHide)

        Dim msgData As New APPBARDATA
        msgData.cbSize =  Marshal.SizeOf(msgData)
         'not necessary to use handle of Windows Taskbar, but can be found by
         'msgData.hwnd = CInt(FindWindow("Shell_TrayWnd", ""))

        'Set the State which will be requested
        msgData.lParam = StateOption

        'Ansd send the message to set this state
        SHAppBarMessage(AppBarMessages.SetState, msgData)
        'Remark on my small (1280x800) screen the desktop area remains the same, but on my larger (1080x1920) screen
        'the desktop icons are displaced when autohide is set on !!! Don't understand why (it then thinks the screen is only 800 high)
    End Sub

    Public Function GetTaskbarStateAutoHide() As Boolean
        'true if AutoHide is on, false otherwise

        Dim msgData As New APPBARDATA
        Dim ret As Integer
        msgData.cbSize =  Marshal.SizeOf(msgData)
        ' also here not necessay to find handle to Windows Taskbar

        ret = SHAppBarMessage(AppBarMessages.GetState, msgData)

        GetTaskbarStateAutoHide = CBool(ret And &H1)
    End Function

End Module

于 2020-05-11T15:40:24.500 に答える
0

このコードから次のようなタスクバークラスを作成しました。

public class Taskbar
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string strClassName, string strWindowName);
[DllImport("shell32.dll")]
public static extern UInt32 SHAppBarMessage(UInt32 dwMessage, ref APPBARDATA pData);
public enum AppBarMessages
{
    New = 0x00,
    Remove = 0x01,
    QueryPos = 0x02,
    SetPos = 0x03,
    GetState = 0x04,
    GetTaskBarPos = 0x05,
    Activate = 0x06,
    GetAutoHideBar = 0x07,
    SetAutoHideBar = 0x08,
    WindowPosChanged = 0x09,
    SetState = 0x0a
}
[StructLayout(LayoutKind.Sequential)]
public struct APPBARDATA
{
    public UInt32 cbSize;
    public IntPtr hWnd;
    public UInt32 uCallbackMessage;
    public UInt32 uEdge;
    public Rectangle rc;
    public Int32 lParam;
}
public enum AppBarStates
{
    AutoHide = 0x01,
    AlwaysOnTop = 0x02
}
/// <summary>
/// Set the Taskbar State option
/// </summary>
/// <param name="option">AppBarState to activate</param>
public void SetTaskbarState(AppBarStates option)
{
    APPBARDATA msgData = new APPBARDATA();
    msgData.cbSize = (UInt32)Marshal.SizeOf(msgData);
    msgData.hWnd = FindWindow("System_TrayWnd", null);
    msgData.lParam = (Int32)(option);
    SHAppBarMessage((UInt32)AppBarMessages.SetState, ref msgData);
}
/// <summary>
/// Gets the current Taskbar state
/// </summary>
/// <returns>current Taskbar state</returns>
public AppBarStates GetTaskbarState()
{
    APPBARDATA msgData = new APPBARDATA();
    msgData.cbSize = (UInt32)Marshal.SizeOf(msgData);
    msgData.hWnd = FindWindow("System_TrayWnd", null);
    return (AppBarStates)SHAppBarMessage((UInt32)AppBarMessages.GetState, ref msgData);
}
}

問題は、私が演奏しているときです

taskbar.SetTaskbarState(Taskbar.AppBarStates.AlwaysOnTop);

taskbar.SetTaskbarState(Taskbar.AppBarStates.AutoHide);

スタートボタンがアクティブになりません(スタートメニューを開くことができません。クリックしてもすべてが発生するわけではありません)。私はWindows10を使用しています。誰かがそれについての解決策を知っていますか?

于 2016-05-12T19:20:13.120 に答える