如何从任务栏(XE4)隐藏firemonkey应用程序button?

根据这个问题 ,可以通过将窗口样式更改为WS_EX_TOOLWINDOW来隐藏fmx任务栏图标。 在XE2和XE3这个代码工作:

uses FMX.Platform.Win, Winapi.Windows; procedure TForm1.Button1Click(Sender: TObject); var h:THandle; begin h := FmxHandleToHWND(Handle); ShowWindow(h, SW_HIDE); SetWindowLong(h, GWL_EXSTYLE, GetWindowLong(h, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); ShowWindow(h, SW_SHOW); end; 

在XE4这个解决scheme不起作用(应用程序button应该隐藏,但没有任何反应)。 任何机构有任何想法?

谢谢。

Solutions Collecting From Web of "如何从任务栏(XE4)隐藏firemonkey应用程序button?"

刚刚在XE7中尝试过,当然它没有工作。 但是,FMX.PlatformWin的一个小外观显示,应用程序句柄现在通过ApplicationHWND函数公开,所以在XE7上工作的代码(别忘记包含单元FMX.Platform.WinWinapi.Windows )是…

 procedure HideAppOnTaskbar (AMainForm : TForm); var AppHandle : HWND; begin AppHandle := ApplicationHWND; ShowWindow(AppHandle, SW_HIDE); SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) and (not WS_EX_APPWINDOW) or WS_EX_TOOLWINDOW); //ShowWindow(AppHandle, SW_SHOW); end; 

最后的ShowWindow是可选的 – 这似乎没有任何区别。 您可以删除扩展样式并还原WS_EX_APPWINDOW样式以再次显示工具栏图标。

看来在XE4 FM应用程序中没有更多的应用程序对象的句柄。 所以我们需要获得主窗体的父窗体。 下面两个小方法隐藏/显示您的应用程序在任务栏上。

 procedure HideAppOnTaskbar (AMainForm : TForm); var AppHandle : HWND; begin AppHandle := GetParent(FmxHandleToHWND(AMainForm.Handle)); ShowWindow(AppHandle, SW_HIDE); SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); end; procedure ShowAppOnTaskbar (AMainForm : TForm); var AppHandle : HWND; begin AppHandle := GetParent(FmxHandleToHWND(AMainForm.Handle)); ShowWindow(AppHandle, SW_HIDE); SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) and (not WS_EX_TOOLWINDOW)); ShowWindow(AppHandle, SW_SHOW); end; 

我们也可以使用“Application.MainForm”而不是传递mainform,但是这个变量在mainform的“OnCreate”事件中没有被赋值。

所以在你的“创建”事件关闭你的mainform,你可以简单地写:

 procedure TMyMainForm.FormCreate(Sender: TObject); begin HideAppOnTaskbar (self); end; 
 procedure HideAppOnTaskbar; var appHandle: HWND; pid, current_pid: DWORD; name: String; begin //ShowWindow(FindWindowA('TFMAppClass', nil), SW_HIDE); name := ChangeFileExt(ExtractFileName(ParamStr(0)), ''); appHandle := 0; pid := 0; current_pid := GetCurrentProcessId(); repeat begin //appHandle := FindWindowExA(0, appHandle, 'TFMAppClass', nil); appHandle := FindWindowExA(0, appHandle, 'TFMAppClass', PAnsiChar(AnsiString(name))); if (appHandle>0) then begin GetWindowThreadProcessId(appHandle, pid); if (current_pid = pid) then break; end; end until (appHandle>0); //SetParent(FmxHandleToHWND(Handle), nil); ShowWindow(appHandle, SW_HIDE); end; 
 HWND hWnd = NULL; DWORD pid, current_pid = GetCurrentProcessId(); do { hWnd = FindWindowExA(NULL, hWnd, "TFMAppClass", NULL); if(hWnd) { GetWindowThreadProcessId(hWnd, &pid); if(current_pid == pid) break; } } while(hWnd); ::SetParent(FmxHandleToHWND(Handle), NULL); ::ShowWindow(hWnd, SW_HIDE);