Ejemplo n.º 1
0
        /// <summary>
        /// キャレットの絶対位置取得
        /// </summary>
        private WPOINT GetCuretPosition()
        {
            //フォーカスのあるハンドルを取っておく
            FocusHandle = GetFocus();

            //ウィンドウのサイズ
            var awnd = GetForegroundWindow();
            var rect = new WRECT();

            GetWindowRect(awnd, ref rect);

            //キャレット位置
            var point = new WPOINT();
            var ok    = false;

            if (!Shared.Setting.PopupCenter)
            {
                var cthred = GetCurrentThreadId();
                var prc    = GetWindowThreadProcessId(awnd, IntPtr.Zero);

                AttachThreadInput(cthred, prc, true);
                ok = GetCaretPos(ref point);
                AttachThreadInput(cthred, prc, false);

                //変わらず。これで取れる奴はGetCaretPosでも取れる。
                //var tinfo = new GUIThreadInfo();
                //tinfo.cbSize = Marshal.SizeOf(tinfo);
                //GetGUIThreadInfo(0, ref tinfo);
            }

            if (ok)
            {
                //キャレット位置が取れればその位置
                return(new WPOINT()
                {
                    x = rect.l + point.x,
                    y = rect.t + point.y
                });
            }
            else
            {
                //取れなければウィンドウの中央
                return(new WPOINT()
                {
                    x = rect.l + (rect.r - rect.l) / 2 - 100,
                    y = rect.t + (rect.b - rect.t) / 2 - 175
                });
            }
        }
Ejemplo n.º 2
0
 extern static bool GetCaretPos(ref WPOINT ptr);
Ejemplo n.º 3
0
 extern static int GetCursorPos(ref WPOINT ptr);