[英]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.