2

Windows 7で導入されたITaskbarList3インターフェイスを使用して、タスクバーアイコンに長いタスクのタスクの進行状況を表示できるようにしようとしています。ドキュメントには、ITaskbarList3コンポーネントを初期化する前に、TaskbarButtonCreatedメッセージを待つ必要があると記載されていますが、TaskbarButtonCreatedメッセージが表示されないようです。

これが私がこれまでに持っているものです:

TaskbarButtonCreatedのカスタムメッセージIDを格納するためのグローバル変数が.cppファイルにあります。

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関数が呼び出されることはありません。

私は一歩を逃していますか?メッセージハンドラーの準備が整う前に、メッセージがフィルターで除外または送信されていますか?

4

1 に答える 1

4

TForm で独自のWindowProcプロパティに値を割り当てることはお勧めできません。まず、HandleDFM ストリーミングのために、コンストラクターに入る前にウィンドウが既に割り当てられている可能性があるため、コンストラクターの実行が開始される前に、ウィンドウの初期メッセージ (いくつかある場合があります) をすべて見逃すことになります。代わりに仮想メソッドをオーバーライドする必要があり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();
}

に関しては、TForm のウィンドウが (再) 割り当てられる (フォームの有効期間中に複数回発生する可能性がある)ChangeWindowMessageFilterEx()たびにそれを呼び出す必要があるため、代わりに仮想メソッドをオーバーライドする必要があります。HandleCreateWnd()

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();
}

最後に、作成する前にプロジェクトの関数でTApplication::ShowMainFormOnTaskbarプロパティを設定して、ウィンドウではなくそのウィンドウがタスクバー ボタンを管理するようにします (また、Flip 3D やタスクバー プレビューなどの他の Vista+ 関連機能を有効にします)。それ以外の場合は、このメソッドを使用して、ウィンドウに送信される可能性のある「TaskbarButtonCreated」メッセージをインターセプトする必要があります。trueWinMain()MainFormTApplicationTApplication::HookMainWindow()TApplication

于 2013-01-31T04:38:26.003 に答える