◀ANSI版開発トップへ
  • 3792 Shell_NotifyIcon関数について質問です。
    • 3794 Re: Shell_NotifyIcon関数について質問です。
      • 3795 Re2: Shell_NotifyIcon関数について質問です。
  • [3792] Shell_NotifyIcon関数について質問です。 ootomo 2004年11月15日 15:48

    さくらエディタのソースをカスタマイズして使用させて
    いただいているものです。

    オリジナルのさくらエディタでは、共通設定のタスクトレイ
    を使用するのチェックをオフにしてOKボタンを押しても
    即座に反映しませんが、即座に反映するように修正して
    使用しています。

    ここで質問なのですが、
    Windows XP や Windows 2003 Serverで、Shell_NotifyIcon
    でタスクトレイアイコンを削除しようとすると、FALSEが返ります。
    アイコンは削除されるのですが・・・・。

    タスクトレイへの登録・解除に4秒以上かかるとタイムアウト
    でエラーになるらしいことは聞いたのですが、なんでスパッと
    削除してくれないのか不思議です。

    VC++に付いているSPY++を起動すると、スパッと削除してくれ、
    Shell_NotifyIconもTRUEを返してくれました。

    また、CEditAppのWM_DESTROYメッセージハンドラにおいて
    トレイアイコンを削除する時は、正常に動きます。

    オリジナルさくらエディタとは関係が薄い話で申し訳ないのですが、
    何かご存知の方、教えてください。お願い致します。
    m(_ _)m
    • [3794] Re: Shell_NotifyIcon関数について質問です。 もか 2004年11月15日 23:11

      うーん。以下のコードで実際にやってみましたが、エラーになりませんでした。
      WinXP Pro SP1 + hotfixs; sakura 1.4.9.0; VC6.0 Pro の組み合わせで
      LunaはOFF、manifestなしの設定です。

      CEditApp::DispatchEvent内(Webブラウザだと見難いかも)
      (中略...)
      case MYWM_CHANGESETTING:
      (中略...)
      if( m_pShareData->m_Common.m_bUseTaskTray ){
      // 無ければ作成
      if( FALSE == m_bCreatedTrayIcon ){
      CreateTrayIcon( m_hWnd );
      ::OutputDebugString( " create TrayIcon\n" );
      }
      }else{
      if( m_bCreatedTrayIcon ){
      ::OutputDebugString( " NIM_DELETE\n" );
      if( FALSE == TrayMessage( hwnd, NIM_DELETE, 0, NULL, NULL ) ){
      ::OutputDebugString( " error NIM_DELETE\n" );
      }
      m_bCreatedTrayIcon = FALSE;
      }
      }
      return 0L;

      case MYWM_NOTIFYICON:
      • [3795] Re2: Shell_NotifyIcon関数について質問です。 ootomo 2004年11月19日 15:10

        いろいろ調べたところ、IMEのバーをタスクバーの中に
        入れているときだけShell_NotifyIcon関数がタイムアウト
        するみたいです。

        他の常駐できるソフトでいろいろ試したところ、みんなそう
        なるみたいです。

        Microsoftのページには、タイムアウトしたら
        Shell_NotifyIcon(NIM_MODIFY,・・・)してみてアイコンの
        登録(削除)が上手く行っているかを確かめて、だめなら
        リトライしなさい、と書いてあったので、そうします。

        お手数お掛けしました。
        m(_ _)m;