• ベストアンサー

ドラッグ中かどうかを取得したいのですが

C++でランチャーを作っているのですが、 画面右端に1ピクセルだけ表示させているウィンドウに カーソルが移動するとニョキッとウィンドウが出てくるランチャーとかよくありますよね? で、そこまではいいのですが、実際に起動させたいアプリケーションなどをドラッグ&ドロップで設定したいのですが、 ドラッグ中だとWM_MOUSEMOVEイベントがこないみたいで、ウィンドウが出てきてくれません・・・ どうしたらドラッグ中でもそれを認識することができるのでしょうか? どなたか教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • kyrsche
  • ベストアンサー率41% (7/17)
回答No.3

ちょっと性急過ぎたかもしれませんね(^^; AppBarというのは、タスクバーみたいにウィンドウの四隅に張り付き、 オプション指定ですが、通常は1ライン残して非表示、マウスを乗せると スライドしてウィンドウを表示するタイプのプログラムで、 新しいウィンドウスタイルとして(確か97年頃に)導入されました。(と記憶) なので、AppBarプログラムを作る(+ドロップ処理を追加する)ことで genki140さんの望むアプリケーションになるのかなーと思った次第です。 googleで検索してみると、ReBarやCoolBarというようですね。 (AppBarとは少し違うのかも) なお、タスクバーのコンテキストメニュー→ツールバーで表示される ReBar(と言い直すことにします)は、通常のウィンドウの周りに WS_THICKFRAMEスタイルを持つウィンドウがあります。 恐らく、こちらのウィンドウへのメッセージだと思いますが、ドラッグ中でも WM_NCHITTESTメッセージが送られている様ですのでこのメッセージを トラップし、MoveWindowなりSetWindowPosなりを行うことで目的の 振る舞いをさせられるのではないか?と思います。 #WM_NCHITTESTは、ウィンドウの外枠に対するメッセージだったはず。 ちなみに、外側のTHICKFRAMEウィンドウには、一定間隔でWM_NCHITTEST メッセージが送られているようですから・・・。 #このメッセージが来なくなったら、ウィンドウを隠すのでしょうね。 ----(閑話)---- さて、AppBar、ReBarなどを使わずに、通常のウィンドウで実現したい ということであれば、(推測で申し訳ありませんが)こんな感じで 実現できるのでは・・・? WindowのサイズはSystemParametersInfoで取得できるので、上下左右の どのデスクトップウィンドウ辺に、どのウィンドウ位置で表示すれば 1px残して表示できるかは求められると思います。 また、クライアント領域であれば、WM_HITTESTメッセージやWM_NCHITTEST メッセージがが送られると思いますのでこのメッセージを補足して ウィンドウ位置の変更などするといいのでは?と思います。 #こちらは推測の上の推測なので。 #少なくとも閑話以前はSPY++とツールバー(自動的に隠すオプションチェック)で #受け取るメッセージを見ながら書いています。

genki140
質問者

補足

回答ありがとうございます。 AppBarの名前は知りませんでしたが、実際に1ピクセル残してやってました^^ で、さっそくWM_NCHITTESTメッセージを確認してみたのですが・・・ やはりドラッグ中では反応してくれませんでしたorz 一体どうしたらいいんでしょう;;

その他の回答 (2)

  • kyrsche
  • ベストアンサー率41% (7/17)
回答No.2

#1です。 ちょっと思いついた(思い出した)ので補足します。 (検証無しですが(^^;;) 画面端からスライドして表示されるウィンドウは、 AppBarというタイプのプログラム(コントロール?)だった 記憶があります。 #確かWindows95より後に導入されたかとおもいます。 #MSDNヘルプをざっと検索したところ、英語ですがドキュメントがいくつかありました。 タスクバーや、クイック起動などのツールバーは、 確かAppBarのプログラムだったかと思います。 もしくは、システムフックなどを使って各ウィンドウにディスパッチされる前の メッセージを取得しているのかもしれません。 自分でアプリを作るのであれば、もう少し調べるのですが・・・ (無責任でごめんなさい)

genki140
質問者

補足

回答ありがとうございました。 せっかく答えていただいたのに悪いのですが、意味がぜんぜん分かりません>< 質問していることとちょっと違う気がします^^; 答えていただいたのに、申し訳ありませんm(_ _)m

  • kyrsche
  • ベストアンサー率41% (7/17)
回答No.1

もし、VC++をお使いであれば、Spy++という ツールが使えるはずです。対象ウィンドウに 送られるウィンドウメッセージが全て表示されるので、 そこからキャッチすべきメッセージがチェック できると思います。 他には、MSDNヘルプに「DragAccesptFiles」という APIが載っていました。 このAPIを使うと、WM_DROPFILESというメッセージが 取得できるようになるみたいなので、 そこから情報が取れるようになるのでは 無いでしょうか・・・。 簡単ですが、参考になれば。

genki140
質問者

補足

Spy++で調べてみたのですが、特にこれといって特別なメッセージは見つかりませんでした^^; DragAccesptFilesですが、ドロップには反応するのですが、ドラッグには反応しないんですorz 返信遅れてすみませんでした、どなたか解凍をお願いします。