現在Win32Appでマウスフックを勉強していて、
クリックしたスクリーン座標を
ウィンドウに表示させようとしているのですが、
どうもうまく表示できません。
dllの内容:
EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
MOUSEHOOKSTRUCT *pmh;
pmh = (MOUSEHOOKSTRUCT *)lp;
HDC hdc;
PAINTSTRUCT paint;
int x1,y1;
char *str = "x1=%d y1=%d";
char strx[128];
if (nCode < 0)
return CallNextHookEx(hHook, nCode, wp, lp);
if (wp == WM_NCLBUTTONDOWN) {
if (pmh->wHitTestCode == HTMENU || pmh->wHitTestCode == HTCLIENT)
return CallNextHookEx(hHook, nCode, wp, lp);
x1 = pmh->pt.x;
y1 = pmh->pt.y;
wsprintf((LPSTR)strx, (LPCSTR)str, x1, y1);
hdc = BeginPaint(hWnd, &paint);
TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
EndPaint(hWnd, &paint);
return TRUE;
}
return CallNextHookEx(hHook, nCode, wp, lp);
}
BeginPaintのhWndは何かの関数を使って
取得しないといけないのでしょうか・・・
また、ネットで調べて組み合わせたので、
色々おかしい点があるかもしれませんが、
そういった所も指摘してもらえるとありがたいです。
どうかよろしくお願いします。
あまり詳しくなく、回答ではありませんが、何点か。
>BeginPaintのhWndは何かの関数を使って
>取得しないといけないのでしょうか・・・
まず、MSDNで BeginPaint( )の仕様を調べましょう。
関数(API)を使用する場合、その仕様を調べ、引数の型、意味を確認するのは、
最低限の基本事項だと思います。
MSDNライブラリ2001年10月リリースのプラットフォームSDKのBeginPaint
()より、
「hWnd 再描画するウィンドウのハンドルを識別します。」
ということで、描画する(させたい)ウィンドウのハンドルを指定してあげる必要があります。
#というか、上記サンプルでは hWndってAPIの引数にしか出てこないけど。。。
で、描画させたいウィンドウのことについて、何も記載されていないため、
これ以上のことはわかりません。
あと、いきなり「DLLの内容」と書かれても、それを呼び出すEXE側の情報がないので、
どのような形のアプリケーションなのかも分かりかねます。
お返事ありがとうございます。
一応BeginPaintには調べてまして、
hWndの箇所に再描画ウィンドウのハンドルを指定する
というのはわかったのですが、
dllからだとそのまま指定しても取得できないのでしょうか?
EXEの方ではhWndというハンドルを持ったウィンドウを表示させ、
そのウィンドウのメニューからフックの開始、終了をさせているだけです。
色々説明不足な所があるかと思うのですが、
どうかまたよろしくお願いします。
フックについては知りませんが。
BeginPaint はウィンドウプロシージャで WM_PAINT に応答するときだけに
使えるものだと思いますが、フックでは使っても良いのでしょうか?
GetDC を使うべきだと思いますが。
(的外れでしたらすみません。)
ウィンドウハンドルについは、MOUSEHOOKSTRUCT のメンバにあるようです。
お返事ありがとうございます。
GetDCを使用したら無事表示する事ができました!
ちなみにTextOutの指定も間違ってましたね。。。
お二人とも本当にありがとうございました。
ツイート | ![]() |