0

我希望能够从任务栏中删除我的 Win32 应用程序的按钮。我也希望以后能够将其添加回来。如何才能做到这一点?我找到了这种方法,但它是用 Delphi 编写的,而我使用的是 C++。

我尝试通过从以下位置更改一行 Remy 的代码来修改此代码:

SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_APPWINDOW); 

SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_TOOLWINDOW);

但这不起作用,按钮仍在任务栏上。

更新:我正在使用的代码(当然来自雷米):

void __fastcall TForm1::CreateHandle()   // this is code from Remy i added to help me trap screen lock
{
 TForm::CreateHandle();

 HWND hWnd = Fmx::Platform::Win::FormToHWND(this);
 if (SetWindowSubclass(hWnd, &SubclassWndProc, 1, reinterpret_cast<DWORD_PTR>(this)))
 {
    MonitoringWTS = WTSRegisterSessionNotification(hWnd, NOTIFY_FOR_THIS_SESSION);
    if (!MonitoringWTS)
        RemoveWindowSubclass(hWnd, &SubclassWndProc, 1);
 }
 else {
    MonitoringWTS = false;
 }

 if (hWnd != NULL)   // this code added from https://stackoverflow.com/questions/28929163/how-to-show-a-secondary-form-on-taskbar-using-fmx-c
 {
 LONG Style = GetWindowLong(hWnd, GWL_EXSTYLE); // <-- don't forget this step!
 SetWindowLong(hWnd, GWL_EXSTYLE, Style | WS_EX_APPWINDOW);
 }
}

使用 C++Builder 10.2 版本 25.0.31059.3231。

4

1 回答 1

1

WS_EX_TOOLWINDOW如果您还保留了默认样式,则仅添加样式是不够的WS_EX_APPWINDOW。尝试改用这个:

LONG_PTR ExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
SetWindowLongPtr(hWnd, GWL_EXSTYLE, (Style & ~WS_EX_APPWINDOW) | WS_EX_TOOLWINDOW);

但是,使TForm行为类似于工具窗口的更简单方法是将其BorderStyle属性设置为bsToolWindowor bsSizeToolWin

但是,请注意,在 XE7+ 中,您应该使用ApplicationHWND()获取HWND实际在任务栏上的 ,因为它可能TForm' 窗口不同。甚至在对您驳回的问题的回答中也指出了这一点,因为它是用 Delphi 而不是 C++ 编写的。相关的函数调用不会改变,只是代码语法。

尝试这个:

#include <FMX.Platform.Win.hpp>
#include <Winapi.Windows.hpp>

void HideAppOnTaskbar()
{
    HWND hAppWnd = Fmx::Platform::Win::ApplicationHWND();
    ShowWindow(hAppWnd, SW_HIDE);
    LONG_PTR ExStyle = GetWindowLongPtr(hAppWnd, GWL_EXSTYLE);
    SetWindowLongPtr(hAppWnd, GWL_EXSTYLE, (ExStyle & ~WS_EX_APPWINDOW) | WS_EX_TOOLWINDOW);
    //ShowWindow(hAppWnd, SW_SHOW);
}

void ShowAppOnTaskbar()
{
    HWND hAppWnd = Fmx::Platform::Win::ApplicationHWND();
    ShowWindow(hAppWnd, SW_HIDE);
    LONG_PTR ExStyle = GetWindowLongPtr(hAppWnd, GWL_EXSTYLE);
    SetWindowLongPtr(hAppWnd, GWL_EXSTYLE, (ExStyle & ~WS_EX_TOOLWINDOW) | WS_EX_APPWINDOW);
    ShowWindow(hAppWnd, SW_SHOW);
}

void __fastcall TForm1::CreateHandle()
{
    //...
    HideAppOnTaskbar(); // or ShowAppOnTaskbar(), as needed
}
于 2018-12-13T20:29:53.760 回答