我使用以下代码从任务栏隐藏...
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
}
}
但是现在我希望任务栏再次显示我的程序-有人知道怎么做吗?
最佳答案
通过使用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 method。
关于c# - 使用C#在Windows中从任务栏隐藏/显示应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19628410/