如何让窗口显示在任务栏中?

3
一个窗口没有显示在任务栏,只显示在系统托盘中。如何使它也在任务栏中显示?
我尝试了下面的代码,但没有效果:
int windowStyle = GetWindowLong(pMainWindow, GWL_EXSTYLE);
SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle & WS_EX_TOOLWINDOW);

这不是我的表单!我正在使用 Process.GetProcessesByName 获取句柄,但我不知道如何访问 Form 类的属性:

Process[] processes = Process.GetProcessesByName("somename");
someProcess = processes[0];

pMainWindow = someProcess.MainWindowHandle;
4个回答

2
以下方法似乎可以解决问题。在调用SetWindowLong之后,隐藏并重新显示窗口,然后它就会在任务栏中显示。
我正在努力寻找一种方法,在窗口最小化后从任务栏中移除它...
[DllImport("User32.Dll")]                
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

[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 ShowWindowInTaskbar(IntPtr pMainWindow)
{                       
    SetWindowLong(pMainWindow, GWL_EXSTYLE, WS_EX_APPWINDOW);

    ShowWindow(pMainWindow, SW_HIDE);
    ShowWindow(pMainWindow, SW_SHOW);      
}

没问题。如果你正在从系统托盘(也称为通知图标)最大化窗口,请记住,当用户将窗口最小化时,他们会期望它从任务栏中移除。正如我在我的回答中所说,我无法让那一部分工作... - ParmesanCodice
我认为这有点不对,例如假设窗口是最顶层的,这将清除WS_EX_TOPMOST标志。您还需要使用GetWindowLong和一个| - the swine

2
请将下面内容翻译成中文:

应当使用 WS_EX_APPWINDOW 比起 WS_EX_TOOLWINDOW。来自于文档:

WS_EX_APPWINDOW: 当窗口可见时,强制顶级窗口显示在任务栏上。

WS_EX_TOOLWINDOW: ... 工具窗口不会出现在任务栏或者用户按ALT+TAB键后出现的对话框中...


谢谢!我尝试了SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle & WS_EX_APPWINDOW);和SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle & WS_EX_APPWINDOW);,但没有任何结果。在谷歌上搜索时,我发现“仅设置扩展窗口样式本身是不够的——它只能在窗口初始化时正确工作”,也许这是一个问题。 - Valentin Golev
一个解决方案是将应用程序窗口作为要编辑的窗口的父窗口。但是我的应用程序中没有窗口,它是一个dll文件! - Valentin Golev

0
将窗体的.ShowInTaskbar属性设置为true。

抱歉,我没有给你所有的信息。这不是我的表单。 - Valentin Golev

-1
你能将返回的 Process.GetProcessesByName() 对象转换为窗体,然后设置它的 .ShowInTaskbar 属性吗?

对象 O = 新的 对象(); O = 进程.GetProcessesByName(); ((Form)O).ShowInTaskBar = true; - tb.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接