日記
なんでもテキストエディタ (13:51)Edit

2004/3/22

ObjectFromLresultへのリンクを動的に解決する方法を見つけた。

HINSTANCE hInst = LoadLibrary("OLEACC.DLL");
LPFNOBJECTFROMLRESULT pfObjectFromLresult =
(LPFNOBJECTFROMLRESULT)GetProcAddress(hInst, "ObjectFromLresult");
LRESULT lRes;
CComPtr<IHTMLDocument2> spDoc;
HRESULT hr = (*pfObjectFromLresult)(lRes, IID_IHTMLDocument2, 0, (void**)&spDoc);

って感じで動的に関数ポインタを得ればいいのか。単にinclude "oleacc.h"しただけじゃライブラリはリンクされないのか? OLEACCってものの正体もいまいちよくわかっていない。

でまあ、カーソル位置のIEコンポーネントへのポインタは取得できたんだけど、そこから先の処理をどう書くべきか迷い中。IHTMLDocument2のポインタから、現在選択されているtextareaを解決する方法が思いつけないんで、また初期のexteditのようなアバウトな方法に戻ってしまうんだよなー。あとC++でOLEオブジェクトをいじる書き方がいまいちよくわからん&めんどうくさいなー。もっと楽な言語で書き直そうかな。


2004/3/21

Webブラウザの入力フォームで好きなエディタを使う」の発展系を考えているうちに、ふと思いついたネタ。Windows上の入力欄をなんでも自分の好きなエディタで入力する仕組みってのもできそうだよな。

基本的な考え方としては、

  • GetCursorPos(&pos)して現在のマウスカーソル位置を取得
  • hwnd = WindowFromPoint(pos)してカーソル位置のコントロールのウィンドウハンドルを取得
  • GetClassName(hwnd, classname, BUFFER_SIZE);してコントロールの種類を判別
  • コントロールがtextareaの類だったら、SendMessage(hwnd, WM_GETTEXT, BUFFER_SIZE, buffer)して、その内容の文字列を取得
  • テンポラリファイルに書き出して、エディタで開く。
  • エディタが終了するまで待つ
  • テンポラリファイルの内容を読み込み、SendMessage(hwnd, WM_SETTEXT, BUFFER_SIZE, buffer)して、コントロールにセットする

といった感じ。

で、試しにやってみようかと思って、プロトタイプを作ってみたんだけど、あいにくWebブラウザ内に表示されるコントロールは、直接WindowPointではとれないんだね。IEとMozillaで試してみたけど、Internet Explorer_ServerとかMozillaWindowClassとか、たぶんウィンドウ自体がActiveXコントロールになっていて、そのレベルまでしか取得できない。

しょうがないから、取得したhwndのclassnameがInternet Explorer_Serverだった場合は、そこからさらにWebブラウザーコントロールへのポインタを取得して……とかやろうかと思ったけれども、調べてみたらなんだか結構面倒くさそうだったんで挫折(というか、書いてはみたんだけど、ObjectFromLresultへのリンクが通らないってところで詰まった)。

誰か続きをやってみて。

Published At2004-03-21 00:00Updated At2004-03-21 00:00