本文介绍了从任务栏隐藏应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我一直在努力从我的应用程序中隐藏任务栏中的另一个应用程序。
我一直在使用SetWindowLong函数来设置/删除extended style上的WS_EX_APPWINDOW
。
我尝试分别设置和删除该属性,并获取当前的WindowLong
,然后将其删除/添加到该属性中,如下所示:
SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & WS_EX_APPWINDOW);
并尝试按如下方式删除它:
SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & ~WS_EX_APPWINDOW);
我也尝试了这两种方法,但没有先让窗口变长。以下是我的完整代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
[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);
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 void HideWindowFromTaskbar(IntPtr pMainWindow)
{
SetWindowLong(pMainWindow, GWL_EXSTYLE, ~WS_EX_APPWINDOW);
ShowWindow(pMainWindow, SW_HIDE);
ShowWindow(pMainWindow, SW_SHOW);
}
private void ButtonHide_Click(object sender, RoutedEventArgs e)
{
HideWindowFromTaskbar(Process.GetProcessesByName("notepad")[0].MainWindowHandle);
}
}
我注意到Spy++在查看属性时发生了变化。我有一堆不同的结果,比如WS_EX_APPWINDOW
被添加了,但也随机地有其他属性消失了,等等。
在查看消息时,我还看到它确实收到了类似STYLE_CHANGED
的消息。
推荐答案
确定哪些窗口在任务栏上有按钮的规则记录在MSDN中。陈瑞蒙给出了以下summary这些规则:
您试图修改另一个应用程序中的窗口这一事实严重阻碍了您的工作。您正在删除关于哪些窗口进入任务栏有一些基本规则。在……里面 简短:
- 如果设置了WS_EX_APPWINDOW扩展样式,则它将显示(当可见时)。
- 如果该窗口是顶级无主窗口,则它将(在可见时)显示。
- 否则不会显示。
WS_EX_APPWINDOW
扩展样式。这是不够的,因为所讨论的窗口将是顶级无主窗口(见项目符号2)。一旦窗口被创建,您就无法更改它的所有者,而且由于该窗口由另一个进程控制,您几乎被卡住了。
剩下的唯一选项是删除WS_EX_APPWINDOW
扩展样式并将其替换为WS_EX_TOOLWINDOW
。这确实会将窗口从任务栏上移走,但它会更改appearance of the window:
该窗口旨在用作浮动工具栏。工具窗口 具有比普通标题栏短的标题栏,并且 窗口标题使用较小的字体绘制。工具窗口不会 出现在任务栏中或出现在用户 按ALT+TAB组合键。如果工具窗口有系统菜单,则其图标不会 显示在标题栏上。但是,您可以显示系统菜单 通过右击或键入ALT+空格。
这篇关于从任务栏隐藏应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!