DOBON.NET DOBON.NETプログラミング掲示板過去ログ

タスクトレイアイコンの右クリックと同等の動作をコードで実現するには

環境/言語:[C#]
分類:[(未選択)]

NotifyIconとContextMenuStripを使用してタスクトレイにアイコンを表示し、右クリックでコンテクストメニューを表示するようにしています。(Formは非表示)

ここでグローバルフックでキーボードをキャプチャして、特定のキーで、できればタスクトレイアイコンの至近に、ContextMenuを表示するようにしたいのですが、単にShow()しただけではキーボードによる操作を受け付けてくれませんし、タスクトレイアイコンの座標が分からないので、タスクトレイアイコンの近くに表示することができません。

NotifyIconに対してMouseイベントを送信する方法も考えましたが、NotifyIconにはHandleプロパティがないので、どうやってハンドルを取得したらいいのか分かりませんでした。(座標が分からないという問題も残るし)

どなたか解決方法をご存じないでしょうか。
よろしくお願いします。
■No22231に返信(毘沙門天さんの記事)
>タスクトレイアイコンの座標が分からないので、タスクトレイアイコンの
>近くに表示することができません。

「タスクトレイ 座標」で検索しました。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200512/05120034.txt
追加です。
http://www.codeproject.com/KB/miscctrl/Shell_NotifyIconEx.aspx
やじゅさん、ありがとうございます。

結局、タスクバーのWindowを検索して、アイコンの矩形の位置を取得し、それを座標にしてタスクバーにマウスメッセージを送信する、という事ですね。

C#からだと面倒ですが(^^;、なんとかやってみます。
リンク先のサンプルソースを参考に実行してみたのですが、途中で行き詰まってしまいました。

ToolbarWindow32のハンドルを取得するところまでは順調でしたが、まずOpenProcessでアクセス権エラーが発生しました。
サンプルではパラメータにPROCESS_ALL_ACCESSを指定していましたが、これをPROCESS_VM_READに変更したところ、ここはクリア。
しかし次にVirtualAllocExで共有メモリの確保ができません。やはりアクセス権エラーです。ここはPAGE_READWRITEをPAGE_READONLYに変更しても変わりませんでした。

リンク先では正常に取得できたとなっているのですが、ひょっとしてOSによって違うのでしょうか。
私の実行環境はWindows XP Proです。
■No22331に返信(毘沙門天さんの記事)
> サンプルではパラメータにPROCESS_ALL_ACCESSを指定していましたが、これをPROCESS_VM_READに変更したところ、ここはクリア。
> しかし次にVirtualAllocExで共有メモリの確保ができません。やはりアクセス権エラーです。ここはPAGE_READWRITEをPAGE_READONLYに変更しても変わりませんでした。
>
> リンク先では正常に取得できたとなっているのですが、ひょっとしてOSによって違うのでしょうか。
> 私の実行環境はWindows XP Proです。
>

うーむ、もしかしたら権限の問題もあるかも知れませんね

一応、下記のサイトによると下の3つの指定が必要とのこと。
PROCESS_VM_OPERATION、PROCESS_VM_READ、PROCESS_VM_WRITE

他プロセスのメモリへのちょっかい@タブコントロール
http://hongliang.seesaa.net/article/7851680.html

タスクバーのタスクボタンの情報を取得したい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24958&forum=7&11

DOBON.NET | プログラミング道 | プログラミング掲示板