C#のプログラムでWin8のデスクトップ操作を改善(2)
前回の続き。
keybd_event()をSendInput()に置き換えても結果は同じ(Win+Xだけ実行できない)なので「使用しているAPIが古いから」といった類の理由ではないようです。
仕方がないので「画面の左下にあるホットスポットを右クリックする」ことでその代用とします。
using System.Runtime.InteropServices; [DllImport("user32.dll", CharSet=CharSet.Auto)] private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, IntPtr dwExtraInfo); private const uint MOUSEEVENTF_ABSOLUTE = 0x8000; private const uint MOUSEEVENTF_MOVE = 0x01; private const uint MOUSEEVENTF_LEFTDOWN = 0x02; private const uint MOUSEEVENTF_LEFTUP = 0x04; private const uint MOUSEEVENTF_RIGHTDOWN = 0x08; private const uint MOUSEEVENTF_RIGHTUP = 0x10; public static void RightClickHotSpot(bool isleft) { System.Drawing.Point p = Cursor.Position; try { uint X = (uint)(isleft ? 0 : 65535); uint Y = (uint)65535; mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, X, Y, 0, IntPtr.Zero); } finally { // XXX - 本当はQAM上にカーソルを持っていきたいが何故か出来ないため元の座標に復元する Cursor.Position = p; } }
Win8のホットスポットの位置はタスクバーの場所にかかわらず絶対座標は常に固定です。
左下は(X, Y) = (0, 65535)なのでmouse_event() Win32 APIを使ってその座標にMOUSEEVENTF_ABSOLUTEフラグ付きで移動させ右クリック(RIGHTDOWN & RIGHTUP)を実行します。
最後にカーソルの位置を元に戻していますが、本当はコメントにもあるようにQuickAccessMenu上にカーソルを持っていきたかったのがどうしてもうまくいかなかったので。
何か手がかりを持っている方はフォロー願いたいところです。
最後に呼び出し方ですが、今回は左下のホットスポットを使いたいので、
RightClickHotSpot(false); //QuickAccessMenuの表示
となります。ちなみに引数をtrueにすると右下のホットスポットの右クリックとなりますが、こちらの機能はデスクトップの表示またはプレビューなのであまりうれしくはないでしょう。