none
プログラムからデスクバンドをON/OFF RRS feed

  • 質問

  • お世話になります。

    ただいまデスクバンドを作成しています。

    デスクバンド自体は作成でき、レジストリに登録すると
    タスクバー → コンテキストメニューのツールバーの一覧に表示されます。
    そしてそれを選択すると作成したデスクバンドが表示されます。

    このデスクバンドの表示、非表示という動作を プログラム上で行う方法は無いものでしょうか?
    IMEツールバーやGoogleデスクトップのように、プログラムから自由にデスクバンドを表示、非表示したいのです。
    (厳密には、デスクバンド作成、破棄ということになるようですが)

    非表示(破棄)は、
     SendMessage( タスクバーの子レバーのHWND, RB_DELETEBAND, MyBandID, 0 );
    で確認しています。

    がこれも正常なやり方なのか疑問なところです。

    デスクバンドは

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/bands.asp

    などを参考にして作成しています。

    ご助力をお願い致します。

    Windows XP SP2 / VISTA
    Visual Studio 2003 / 2005
    MFC

    2007年1月10日 11:52

回答

  • 不安な点もあるのですが、希望通りの動作をしているため解決とさせていただきます。

    皆様、どうもありがとうございました。

    2007年1月29日 1:08

すべての返信

  • SendMessage を使うのは、COM的にはお勧めできない方法だと思います。

    バンドのサイトから IBandSite インターフェース を取得し、SetBandStateを使えば、
    表示/非表示が設定できるかと思います。
    2007年1月10日 15:30
  •  社本 ワック さんからの引用

    バンドのサイトから IBandSite インターフェース を取得し、SetBandStateを使えば、
    表示/非表示が設定できるかと思います。

    IBandSiteインタフェースですね。
    了解いたしました。
    調べてみます。

    サイトは、MyBand::SetSiteで渡されてくるので取得できますが
    これでは、タスクバーのメニューからバンドの表示を選択された後の動作になります。

    ということは、
    バンドプログラムでない外部のプログラムが、デスクバンドの挿入/破棄、表示/非表示などを行いたい場合は、
    タスクバー(のレバーコントロール?)のIBandSiteに対してアクセスすると言うことになるのでしょうか?

     

     

     

    2007年1月11日 3:24
  • サイトのインターフェースポインタの取得についてですが、
    slicerさんはどのようなものを作りたいのかわからないので、
    何とも答えようがありません。

    全くの外部のアプリケーションからだと、確かに厳しいと思われます。
    ただし、バンドと同様のエクステンションであれば、簡単ですよね?
    #あと、単にバンドと書いてありますが、IEだけではなくタスクバーにも
    #バンドの実装はあります。(IEだという前提で回答しています)

    バンド以外でサイトを取得した場合には、IServiceProvider::QueryService
    を使わないと、IBandSiteは取得できないかもしれません。
    サービスIDとして、SID_SBandSiteを指定すればよいかと思います。
    2007年1月11日 11:22
  • こんにちは、 社本 ワック様。

     社本 ワック さんからの引用
    サイトのインターフェースポインタの取得についてですが、
    どのようなものを作りたいのかわからないので、何とも答えようがありません。

    申し訳ありません、説明不足でした。

    現在。キーボード入力を補助するプログラムがあり、入力状態をフローティングバーで表示しています。
    この入力状態の表示画面を、バンド化しタスクバー上に表示したいのです。
    理想は、そのものずばり言語バーです。

    デスクバンド自体は作成できているのですが、
    そのデスクバンドをデスクバンドの外部プログラムから作成/破棄することが不明でしたので、質問させていただきました。

    極論を申しますと、
    タスクバーのQuickLaunchが無効の状態で、プログラムから有効にできる方法がないかどうか ということになってしまうのかもしれません。(違うかもしれませんが)

    ご助言を元にしていろいろと試行錯誤しまして、今は以下のやり方でどうなのかな? と思っています。

    ・自作のデスクバンドをタスクバーに作成する
     IBandSite* pIBandSite( NULL );
      CoCreateInstance( __uuidof(TrayBandSiteService), NULL, CLSCTX_LOCAL_SERVER, __uuidof(IBandSite), (void**)&pIBandSite )

      IUnknown* pIMyBand( NULL );
      ::CoCreateInstance( CLSID_MYBAND, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pIMyBand );
     MyBandID = pIBandSite->AddBand( pIMyBand ) );  // MyBandを作成しタスクバーに追加


    ・自作のデスクバンドをタスクバーから削除する
     IBandSite* pIBandSite( NULL );
      CoCreateInstance( __uuidof(TrayBandSiteService), NULL, CLSCTX_LOCAL_SERVER, __uuidof(IBandSite), (void**)&pIBandSite )
      pIBandSite->RemoveBand( MyBandID );       // デスクバンドの削除を要求


    これで希望通りの動作をしてくれるようになったのですが、作成の方で一つ疑問があります。
    というのも、ご覧の通りMyBandのインスタンスは外部プログラム上で作成しています。
    ですので、当たり前ですがタスクバーとはプロセスが異なります。

    しかしSPY++で確認する限り、言語バーのデスクバンドは、タスクバーと同一のプロセスIDとスレッドIDのなのです。

    つまりタスクバーが言語バーのデスクバンドのインスタンスを作成しているのかなと。

    一応は、以上のやり方で希望通りの動作はしているのですが、
    どこかで問題が起こるのではないかと不安な状態です。


     

    2007年1月12日 13:35
  • 不安な点もあるのですが、希望通りの動作をしているため解決とさせていただきます。

    皆様、どうもありがとうございました。

    2007年1月29日 1:08