/// <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 }); } }
extern static bool GetCaretPos(ref WPOINT ptr);
extern static int GetCursorPos(ref WPOINT ptr);