VBのTEXTBOX内ではなく、他の起動しているプログラムでの入力位置を調べたいのです。
例としまして、顧客管理ソフトを起動中に、F11を押すと、特定の作業をする、といったイメージのプログラムを考えています。
その時、作業Windowsを、現在入力中のカーソル付近にPOPUPさせたいのです。
何とかCaretに関するAPIは見つけたのですが、どうしてもずれが出ます。
どこが間違っているのでしょうか?
rethd = GetForegroundWindow()
p = GetWindowRect(rethd, rct)
retTred = GetWindowThreadProcessId(rethd, lpdwProcessID)
Me.Top = (rct.Top + RetInfo.rcCaret.Top) * Screen.TwipsPerPixelY
Me.Left = (rct.Left + RetInfo.rcCaret.Left) * Screen.TwipsPerPixelX
特にY位置のずれが激しいのですが、何か必要な要素を忘れているのでしょうか?
type宣言です。
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type GUITHREADINFO
cbSize As Long
flags As Long
hwndActive As Long
hwndFocus As Long
hwndCapture As Long
hwndMenuOwner As Long
hwndMoveSize As Long
hwndCaret As Long
rcCaret As RECT
End Type
GetGUIThreadInfo で取得できる rcCaret は、hwndCaret が示すウィンドウ(コントロール)のクライアント座標で表されます。親フォームのクライアント座標ではありません。
クライアント座標をスクリーン座標に変換するには API の ClientToScreen 関数が便利です。
Hongliangさん、ありがとうございます。
ClientToScreen早速探してみます。
親フォームのクライアント座標はどうして取得できるのでしょうか?
とりあえず、いろいろと試してみます。
ツイート | ![]() |