private void CheckWindow() { var foreInfo = GetWindowAPI_RECTAndText(API.GetForegroundWindow());//メモ帳のウィンドウ //Foregroundwindowから取得できるウィンドウ IntPtr foreW = API.GetForegroundWindow(); //var ancesParent = GetWindowRectAndText(API.GetAncestor(foreW, API.AncestorType.GA_PARENT));//Textなしの全画面サイズ //var ancesRoot = GetWindowRectAndText(API.GetAncestor(foreW, API.AncestorType.GA_ROOT));//メモ帳のウィンドウ //var ancesRootOwner = GetWindowRectAndText(API.GetAncestor(foreW, API.AncestorType.GA_ROOTOWNER));//メモ帳のウィンドウ //var lastPop = GetWindowRectAndText(API.GetLastActivePopup(foreW));//メモ帳のウィンドウ //var menu = GetWindowRectAndText(API.GetMenu(foreW));//none //var parent = GetWindowRectAndText(API.GetParent(foreW));//none //var topChild = GetWindowRectAndText(API.GetTopWindow(foreW));//Textなし、メモ帳のウィンドウのクライアント //Foregroundwindowのcmd各種 //var childs = GetWindowRectAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_CHILD, LOOP_LIMIT));//メモ帳のウィンドウのクライアント、その後はnone var popups = GetWindowAPI_RECTAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_ENABLEDPOPUP, LOOP_LIMIT));//none //var first = GetWindowRectAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_HWNDFIRST, LOOP_LIMIT));//TextはすべてDefault IME //var last = GetWindowRectAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_HWNDLAST, LOOP_LIMIT));//TextはすべてProgram Manager //var nexts = GetWindowRectAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_HWNDNEXT, LOOP_LIMIT));//全て関係ないアプリ //var prevs = GetWindowRectAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_HWNDPREV, LOOP_LIMIT));//すべて関係ないアプリ //var owners = GetWindowRectAndTexts(GetCmdWindows(foreW, API.GETWINDOW_CMD.GW_OWNER, LOOP_LIMIT));//none //カーソルの下のウィンドウハンドル API.GetCursorPos(out API.POINT cP); IntPtr hWnd = API.WindowFromPoint(cP); var CursorW = GetWindowAPI_RECTAndText(hWnd); //右クリックメニュー var AncesParent = GetWindowAPI_RECTAndText(API.GetAncestor(hWnd, API.AncestorType.GA_PARENT)); //Textなしの全画面サイズ var AncesRoot = GetWindowAPI_RECTAndText(API.GetAncestor(hWnd, API.AncestorType.GA_ROOT)); //右クリックメニュー var AncesRootOwner = GetWindowAPI_RECTAndText(API.GetAncestor(hWnd, API.AncestorType.GA_ROOTOWNER)); //右クリックメニュー var LastPop = GetWindowAPI_RECTAndText(API.GetLastActivePopup(hWnd)); //右クリックメニュー var Menu = GetWindowAPI_RECTAndText(API.GetMenu(hWnd)); //none var Parent = GetWindowAPI_RECTAndText(API.GetParent(hWnd)); //none var TopChild = GetWindowAPI_RECTAndText(API.GetTopWindow(hWnd)); //none var Childs = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_CHILD, LOOP_LIMIT)); //すべてnone var Popups = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_ENABLEDPOPUP, LOOP_LIMIT)); //none var First = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_HWNDFIRST, LOOP_LIMIT)); //TextはすべてDefault IME var Last = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_HWNDLAST, LOOP_LIMIT)); //TextはすべてProgram Manager var Nexts = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_HWNDNEXT, LOOP_LIMIT)); //右クリックメニューの影ウィンドウ、それ以降は関係ないアプリ var Prevs = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_HWNDPREV, LOOP_LIMIT)); //8個noneが続いたあと関係ないアプリ var Owners = GetWindowAPI_RECTAndTexts(GetCmdWindows(hWnd, API.GETWINDOW_CMD.GW_OWNER, LOOP_LIMIT)); //none }
/// <summary> /// 最前面ウィンドウと、そのメニューや右クリックメニューウィンドウ群のRectリストを作成 /// </summary> /// <returns></returns> private List <Rect> MakeForeWinndwWithMenuWindowRectList() { List <Rect> result = new(); //Foregroundのハンドル取得 IntPtr fore = API.GetForegroundWindow(); var infoFore = GetWindowRectAndText(fore); //ForegroundのPopupハンドルとRect取得 IntPtr popup = API.GetWindow(fore, API.GETWINDOW_CMD.GW_ENABLEDPOPUP); Rect popupRect = GetWindowRect(popup); var infoPop = GetWindowRectAndText(popup);//確認用 //Popupが存在する(Rectが0じゃない)場合 if (popupRect != new Rect(0, 0, 0, 0)) { //PopupのNEXT(下にあるウィンドウハンドル)を収集 List <IntPtr> pops = GetCmdWindows(popup, API.GETWINDOW_CMD.GW_HWNDNEXT, LOOP_LIMIT); var infoPops = GetWindowRectAndTexts(pops);//確認用 //必要なRectだけを選別 result = SelectRects(pops); ////Textを持つウィンドウ以降を除去 ////残ったウィンドウのRect取得 ////ドロップシャドウウィンドウのRectを除去 ////前後のRectが重なっているところまで選択して、以降は除外 //GetForegroundwindowの見た目通りのRectを追加 result.Add(GetWindowRectMitame(fore)); } //Popupが存在しない(Rectが0)場合 else { //GetForegroundwindowの見た目通りのRectを追加 Rect foreRect = GetWindowRectMitame(fore); result.Add(foreRect); //マウスカーソル下のウィンドウハンドル取得、これを基準にする API.GetCursorPos(out API.POINT cursorP); IntPtr cursor = API.WindowFromPoint(cursorP); //Rect cursorRect = GetWindowRectMitame(cursor); //カーソル下のウィンドウRectとForegroundのRect重なり判定 //関係あるウィンドウなら、Textがない and Rectが重なっている //重なりはメニューウィンドウ全域と重なっていればおk判定にする List <Rect> rs = new(); if (GetWindowText(cursor) == "") { //基準の上下それぞれのウィンドウハンドル取得 List <IntPtr> prev = GetCmdWindows(cursor, API.GETWINDOW_CMD.GW_HWNDPREV, LOOP_LIMIT); //上 List <IntPtr> next = GetCmdWindows(cursor, API.GETWINDOW_CMD.GW_HWNDNEXT, LOOP_LIMIT); //下 //必要なRectだけを選別 List <Rect> rsPrev = SelectRects(prev); List <Rect> rsNext = SelectRects(next); //前後のRectリストを統合 rs = rsPrev.Union(rsNext).ToList(); } //重なり判定はForegroundのRectと、それ以外のRectを結合したRectで判定する //Rectの結合はGeometryGroupを使う GeometryGroup gg = new(); for (int i = 0; i < rs.Count; i++) { gg.Children.Add(new RectangleGeometry(rs[i])); } //重なり判定、重なっていたらForegroundのRect+それ以外のRect if (IsOverlapping(gg, new RectangleGeometry(foreRect))) { result = result.Union(rs).ToList(); } //重なっていない場合はメニューウィンドウは開かれていないと判定して //ForegroundのウィンドウRectだけでいい } return(result); }