Ejemplo n.º 1
0
        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
        }
Ejemplo n.º 2
0
        /// <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);
        }