我收到一份申请,有一个主窗口,然后它打开了新的表格。
整个应用程序就像一个文档阅读器,有许多类型的子表单。
例如,我打开了主窗口,3个文档详细表单和4个其他内容的编辑器。
现在。由于所有子窗体都是主窗体的子窗体,因此它们都分组在任务栏上的一个图标下,当您试图在悬停时显示的列表中搜索某个窗口时,可能会造成混乱。
是否可以告诉系统,特定表单的所有实例必须在单独的图标中组合在一起?
这样地
c# - 任务栏上的子表单组-LMLPHP
我通过了一些指南,但不幸的是,这个具体的问题我还没有找到解决任何地方。
尽管我在这里寻找C#实现来进行我的应用程序设计和简单的解决方案预览,但真正的应用程序可能会在Delphi中实现,所以真正的和主要的问题是操作系统是否支持这种行为,因为这是对正常行为的一个巨大重写-是否有可能做到在窗户里?在Linux(gnome、kde、xfce、unity)和MacOS上也可以做到这一点?对于这些问题,我不需要知道如何去做,只要有人已经碰到了这个问题,并且可以给我一些提到这个问题的文章的解决方案。
提前谢谢。

最佳答案

我无法帮助您使用其他平台,如Linux,但这是Windows解决方案:
您可以使用Windows任务栏API。对于C#,.NET以一种简洁的方式提供了它。必须引用程序集System.XamlMicrosoft.WindowsAPICodePack.Shell,然后才能使用以下代码:

using Microsoft.WindowsAPICodePack.Taskbar;

/* ... */

// Put this code in myForm.OnLoad or so
TaskbarManager.Instance.SetApplicationIdForSpecificWindow(myForm.Handle, "MyInternalGroupID");

这将为您的窗口分配一个“应用程序模型ID”。Windows会将具有相同应用程序型号ID的所有窗口组合在一起。因此,您必须为不同的组使用不同的名称,而不是MyInternalGroupID
请注意,这也适用于多个实例,因此属于同一组的窗口将一起显示,即使它们来自多个进程。如果不需要,则必须在组名中包含当前进程ID。
进一步阅读:Taskbar API overviewThe Old New Thing article (with C++ example)
对于Delphi,我找到了一个解决方案here,Bjórn Ole的功劳是:
unit uAppID;

interface

uses
  Windows,
  ActiveX,
  PropSys,
  PropKey;

function GetAppID(AHandle: THandle): string;
function SetAppID(AHandle: THandle; const AAppID: string): boolean;

implementation

function SHGetPropertyStoreForWindow(hwnd: hwnd; const riid: TGUID; out ppv: IPropertyStore)
  : HRESULT; stdcall; external 'shell32.dll';

function GetAppID(AHandle: THandle): string;
var
  hr: HRESULT;
  pps: IPropertyStore;
  v: TPropVariant;
begin
  hr := SHGetPropertyStoreForWindow(AHandle, IID_IPropertyStore, pps);
  if Succeeded(hr) then
  begin
    pps.GetValue(PKEY_AppUserModel_ID, v);
    result := v.bstrVal;
  end
  else
    result := '';
end;

function SetAppID(AHandle: THandle; const AAppID: string): boolean;
var
  hr: HRESULT;
  pps: IPropertyStore;
  v: TPropVariant;
begin
  hr := SHGetPropertyStoreForWindow(AHandle, IID_IPropertyStore, pps);
  if Succeeded(hr) then
  begin
    v.vt := VT_BSTR;
    v.bstrVal := SysAllocString(PChar(AAppID));
    result := pps.SetValue(PKEY_AppUserModel_ID, v) = S_OK;
  end
  else
    result := false;
end;

end.

基本上,你需要用在C#中调用SetAppID的方式调用TaskbarManager.Instance.SetApplicationIdForSpecificWindow

关于c# - 任务栏上的子表单组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37133319/

10-13 07:47
查看更多