基本上,我想做一个简单的切换程序(这将被映射到一些键盘快捷方式),如果在正常模式下将任务栏设置为自动隐藏模式(相反,如果处于自动隐藏模式,则为正常显示模式)。
你知道如何在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。)
任务栏是一个appbar,你可以用SHAppBarMessage来控制它
以下是我使用的功能:
[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();
这是一个比C#更多的与WIN32 API相关的问题。 你可以使用这个 (当然需要翻译成网点)来隐藏任务栏。
您可以使用http://www.pinvoke.net将WIN32 API调用转换为dot net。
您可以通过使用这里描述的键来操作注册表来实现这一点 。
这应该是一件容易的事,祝你好运。
我跟着@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); }
这是我使用的解决方案:7+ Taskbar Tweaker( http://rammichael.com/7-taskbar-tweaker )。 荣誉给作者!
一个简单的免费程序,可以切换任务栏自动隐藏在一个动作 – 分配它双击或中间点击任务栏的空白或自己设置(请参阅高级选项+帮助,右键单击尝试图标) 。
这对于我来说是非常重要的,因为我在垂直位置使用任务栏,而在笔记本电脑上当我投影到频繁使用的XVGA时,空间不足。 这是一个真正的痛苦,这么多的点击来切换它。
这是一个耻辱,自90年代以来,微软还没有进一步开发这个软件。 今天,我认为一个选择就是它在办公室项目中表现得如同丝带一样。
干杯!
马里安
我从这个代码像这样做了一个任务栏类:
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);
我的开始按钮没有更多的激活(我不能打开startmenu,点击它不会导致一切)。 我正在使用Windows 10.有没有人知道这个解决方案?