HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0512
かげぼうしキャレット位置の取得方法6解決


かげぼうし

リンク

2009/5/12(Tue) 04:20:13|NO.25118

HSP初心者です。
他のアプリケーション(MS Word)のキャレット位置の座標を取得する段階で困っています。
キャレットの移動と共にキャレットの下にHSPのウィンドウを移動させたいのです。
APIのGetForegroundWindow, GetWindowThreadProcessId, GetGUIThreadInfoを使えば良いというところまでたどり着いたのですが、
なにぶんコーディングの仕方がはっきりしません。
申し訳ありませんがどなたかご教授願えませんでしょうか?
よろしくお願いします。



この記事に返信する


hspail

リンク

2009/5/12(Tue) 08:22:48|NO.25119

FindWindow で WORD のハンドルを取得

GetWindow で WORD のエディット部のハンドルを取得

GetCaretPos でキャレット位置を取得

ClientToScreenでスクリーン座標に変換

でできるかもしれません。
WORD 持ってないのでわかりませんが・・・



かげぼうし

リンク

2009/5/12(Tue) 12:26:01|NO.25120

hspailさん、返答ありがとうございました。
"FindWindow で WORD のハンドルを取得"はできました。
現在、"GetWindow で WORD のエディット部のハンドルを取得"したいところなのですが、
GetWindowに GW_CHILD を指定して子ハンドルを取得しようとしています。
GetClassNameでClass名を取得し,WORDのエディット部である"_WwG"と比較しようとしています。
どうもClass名がうまく取得できていないようです。

なにぶん初心者なもので申し訳ないのですが、その部分のコーディングを教えていただけないでしょうか?
よろしくお願いいたします。

いかがその部分の抜粋です。

pre
class="OpusApp"
FindWindow class, 0
hwnd_Word= stat
GetWindow hwnd_Word, $5 : hwnd_Child=stat
sdim szName, 256
GetClassName hwnd_Child, szName, 256 // ClassNameを取得
Title "F=" + szName : stop
/pre



hspail

リンク

2009/5/12(Tue) 13:25:21|NO.25121


GetClassName hwnd_Child, szName, 256 // ClassNameを取得
の部分は szNameのポインタを渡します。

GetClassName hwnd_Child, varptr(szName), 256 // ClassNameを取得

Word インストールしたのでちょっと調べてみますね。



hspail

リンク

2009/5/12(Tue) 14:01:11|NO.25122

GetCaretPos では無理でした。すみません。
せっかく作ったので _WwG のウィンドウハンドルを取得するサンプルを置いておきます。
MS Word 2007 用ですので、ほかのバージョンでは少しウィンドウ構造が違うかもしれません。


#include "user32.as" #define GW_HWNDFIRST 0 #define GW_HWNDLAST 1 #define GW_HWNDNEXT 2 #define GW_HWNDPREV 3 #define GW_OWNER 4 #define GW_CHILD 5 sdim szName, 256 // クラス名 // 1.ワードのウィンドウハンドルを取得 class="OpusApp" FindWindow class, 0 hwnd_Word= stat // 2.クラス名「_WwF」のウィンドウハンドルを取得 repeat if (cnt == 0) { GetWindow hwnd_Word, GW_CHILD : hwnd_Child=stat // OpusAppの最初の子ウィンドウのハンドルを取得 } else { GetWindow hwnd_Child, GW_HWNDNEXT : hwnd_Child = stat // 次の子ウィンドウのハンドルを取得 } if (hwnd_Child == 0) : dialog "_WwF が見つかりませんでした" : end GetClassName hwnd_Child, varptr(szName), 256 // ClassNameを取得 if (szName == "_WwF" ) : hwnd_WwF = hwnd_child : break loop print szName + " のウィンドウハンドル = "+hwnd_WwF // 3.クラス名「_WwB」のウィンドウハンドルを取得 repeat if (cnt == 0) { GetWindow hwnd_WwF, GW_CHILD : hwnd_Child = stat // _WwFの最初の子ウィンドウのハンドルを取得 } else { GetWindow hwnd_Child, GW_HWNDNEXT : hwnd_Child = stat // 次の子ウィンドウのハンドルを取得 } if (hwnd_Child == 0) : dialog "_WwB が見つかりませんでした" : end GetClassName hwnd_Child, varptr(szName), 256 // ClassNameを取得 if (szName == "_WwB" ) : hwnd_WwB = hwnd_Child : break loop print szName + " のウィンドウハンドル = "+hwnd_WwB // 4.クラス名「_WwG」のウィンドウハンドルを取得 repeat if (cnt == 0) { GetWindow hwnd_WwB, GW_CHILD : hwnd_Child = stat // _WwBの最初の子ウィンドウのハンドルを取得 } else { GetWindow hwnd_Child, GW_HWNDNEXT : hwnd_Child = stat // 次の子ウィンドウのハンドルを取得 } if (hwnd_Child == 0) : dialog "_WwG が見つかりませんでした" : end GetClassName hwnd_Child, varptr(szName), 256 // ClassNameを取得 if (szName == "_WwG" ) : hwnd_WwG = hwnd_Child : break loop print szName + " のウィンドウハンドル = "+hwnd_WwG stop



ほげ

リンク

2009/5/12(Tue) 14:02:00|NO.25123

キャレットの座標を取得するサンプルを作ってみました。
とりあえずカーソルの下にあるウインドウから情報を得るようにしています。


#include "user32.as" ;GUITreadInfo 構造体 ;typedef struct tagGUITHREADINFO { ; DWORD cbSize; ; DWORD flags; ; HWND hwndActive; ; HWND hwndFocus; ; HWND hwndCapture; ; HWND hwndMenuOwner; ; HWND hwndMoveSize; ; HWND hwndCaret; ; RECT rcCaret; ;} GUITHREADINFO, *PGUITHREADINFO; gsel 0,2 dim GUIThreadInfo,12 GUIThreadInfo(0) = 48 // 構造体のサイズを入れておかないとエラーになる repeat // カーソルの下にあるウインドウのハンドルを取得 WindowFromPoint ginfo(0),ginfo(1) :winHnd = stat // ウインドウハンドルからスレッドIDを取得 GetWindowThreadProcessId winHnd,0 :threadID = stat // スレッドIDからキャレットの情報などを取得 GetGUIThreadInfo threadID,varptr(GUIThreadInfo(0)) if stat == 0{ dialog "GetGUIThreadInfo失敗",1,"error" end } redraw 0 color 255,255,255 :boxf color 0,0,0 pos 0,0 mes "WinHandle \t| "+winHnd mes "threadID \t| "+threadID repeat 12 // GUIThreadInfo(8)〜GUIThreadInfo(11)がキャレットの左上座標と右下座標 mes "GUIThreadInfo("+cnt+") \t| "+GUIThreadInfo(cnt) loop redraw 1 await 100 loop

GetGUIThreadInfoって便利ですねー
今までプロセスフックしてGetCaretPosしてましたよー(ノД`)



かげぼうし

リンク

2009/5/14(Thu) 04:32:48|NO.25133

Hspailさん、ほげさん、ご親切なご指導をありがとうございました!
おかげさまで問題が解決しました。
Hspailさん、わざわざWordまでインストールしてくださってありがとうございました!
ウィンドウハンドルから直接_WwGを探そうと思いましたがHspailさんのように一つずつ探さないと見つからないことがわかりました。
そうすると_WwGはひ孫のクラスということになるのでしょうか?
詳しく調べてくださってありがとうございます。

ほげさん、おかげさまでキャッレットの動きに合わせて自分のウィンドウが移動するようになりました。
本当にありがとうございます。
ClientToScreen を使って座標を得ているのですがxに+40,yに+80しないと目標位置にウィンドウが出ません。
ですが、希望通りの結果が得られましたので解決とさせていただきます。
また、質問に出くわした際にはよろしくお願いいたします。



ONION software Copyright 1997-2023(c) All rights reserved.