簡體   English   中英

如何在C ++ Builder中創建ITaskbarList3?

[英]How can I create an ITaskbarList3 in C++ Builder?

我正在嘗試使用Windows 7引入的ITaskbarList3接口,以便可以在任務欄圖標中顯示冗長任務的任務進度。 該文檔指出,在嘗試初始化ITaskbarList3組件之前,我應該等待TaskbarButtonCreated消息,但是我似乎沒有收到任何TaskbarButtonCreated消息。

這是我到目前為止的內容:

我的.cpp文件中有一個全局變量,用於存儲TaskbarButtonCreated的自定義消息ID。

static const UINT m_uTaskbarBtnCreatedMsg = 
    RegisterWindowMessage( _T("TaskbarButtonCreated") );

我創建了一個單獨的WndProc函數來處理新消息。

void __fastcall TForm1::WndProcExt(TMessage &Message)
{
    if(Message.Msg == uTaskbarBtnCreatedMsg && uTaskbarBtnCreatedMsg != 0) {
        OnTaskbarBtnCreated();
    }
    else {
        WndProc(Message);
    }
}

在我的表單構造函數中,第一行將WindowProc屬性設置為WndProcExt以路由消息。 我也嘗試在ChangeWindowMessageFilter中扔看一下是否出於某種原因而過濾了TaskbarButtonCreated消息。

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    WindowProc = WndProcExt;
    ChangeWindowMessageFilterEx(Handle, uTaskbarBtnCreatedMsg, MSGFLT_ALLOW, NULL);

    ...
}

在調試器中,ChangeWindowMessageFilterEx的返回值始終為true。 我還確認了WndProcExt函數可以接收各種Windows消息,而不是我正在尋找的消息。 OnTaskbarBtnCreated函數永遠不會被調用。

我錯過了一步嗎? 在我的消息處理程序准備就緒之前,是否已將消息過濾掉或發送出去?

讓TForm為自己的WindowProc屬性分配一個值不是一個好主意。 對於初學者來說,由於DFM流,可能甚至在輸入構造函數之前就已經分配了Handle窗口,因此在構造函數開始運行之前,您將錯過該窗口的所有初始消息(可能有幾個)。 您需要改寫虛擬WndProc()方法,並確實將TaskbarButtonCreated消息傳遞給默認處理程序,不要阻止它:

static const UINT m_uTaskbarBtnCreatedMsg = RegisterWindowMessage( _T("TaskbarButtonCreated") );

void __fastcall TForm1::WndProc(TMessage &Message)
{
    TForm::WndProc(Message);
    if ((Message.Msg == uTaskbarBtnCreatedMsg) && (uTaskbarBtnCreatedMsg != 0))
        OnTaskbarBtnCreated();
}

至於ChangeWindowMessageFilterEx() ,您需要在每次(重新)分配TForm的Handle窗口時調用它(在Form的生命周期中可能發生多次),因此您需要改寫虛擬的CreateWnd()方法:

void __fastcall TForm1::CreateWnd()
{
    TForm::CreateWnd();
    if (CheckWin32Version(6, 1) && (uTaskbarBtnCreatedMsg != 0))
        ChangeWindowMessageFilterEx(Handle, uTaskbarBtnCreatedMsg, MSGFLT_ALLOW, NULL);
    // any other Handle-specific registrations, etc...
}

void __fastcall TForm1::DestroyWindowHandle()
{
    // any Handle-specific de-registrations, etc...
    TForm::DestroyWindowHandle();
}

最后,在創建MainForm之前,在項目的WinMain()函數中將TApplication::ShowMainFormOnTaskbar屬性設置為true ,以便其窗口(而不是TApplication窗口)管理任務欄按鈕(並啟用其他與Vista +相關的功能,例如Flip 3D和任務欄預覽)。 否則,您將必須使用TApplication::HookMainWindow()方法來攔截可能發送到TApplication窗口的任何“ TaskbarButtonCreated”消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM