ウインドウハンドルをマウスカーソル位置で取得し
そこにPostMessageでWM_LBUTTONDOWNと
WM_LBUTTONUPを送ってマウス位置を
マウスクリックボタン以外で(例えば任意のキーとかで)
マウスクリック操作をする物を
作っているのですがウィンドウのクライアント領域は
下の方法でうまくいくのですが
タイトルバー上ではうまくいきません
(閉じる、最小化ボタンなどが動作しません)
タイトルバー上ではマウスメッセージを送るだけでは
だめなのでしょうか?
解決策が分かる方、おられましたらよろしくお願いします。
var p: TPoint; h: HWND;
GetCursorPos(p);
h := WindowFromPoint(p);
Windows.ScreenToClient(h, p); //ここをコメントアウトしてもダメでした
PostMessage(h, WM_LBUTTONDOWN, 0, MakeLParam(p.X, p.Y));
PostMessage(h, WM_LBUTTONUP, 0, MakeLParam(p.X, p.Y));
タイトルバーなどの部分はノンクライアント領域なので
WM_NCLBUTTONUP/DOWNではどうでしょうか?
tttさん、ありがとうございます。
WM_NCHITTESTとWM_NCLBUTTONDOWN、WM_NCLBUTTONUPで
タイトルバーをクリックしたらアクティブには(ダブルクリックで最大化とかは)出来るようになりました。
ただ、下の方法では、システム、最小化、最大化、閉じるボタンが
WM_NCLBUTTONDOWN状態で止まってしまいうまくいかないです。
他アプリのタイトルバーのボタンを操作するのは、また違った方法が必要なのでしょうか。
gp = グローバル座標
nht = WM_NCHITTESTメッセージが返すコード
PostMessage(h, WM_NCLBUTTONDOWN, nht, MakeLParam(gp.X, gp.Y));
PostMessage(h, WM_NCLBUTTONUP, nht, MakeLParam(gp.X, gp.Y));
mouse_eventの方が簡単に思えますが、
PostMessageの場合、基本的なWindowsMessageの流れを把握する必要があります。
WM_LBUTTONDOWNのWPARAMも0で大丈夫なんですか?
http://yokohama.cool.ne.jp/chokuto/urawaza/message/WM_LBUTTONDOWN.html
Mouse_Event・・・こんないい関数があったなんて。
ありがとうございます。Mouse_Eventでうまくいきました。
PostMessageのほうを、調べてみたところ
ウィンドウ右上の閉じる(×)ボタンをクライアント領域に擬似的に配置する方法
http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/ea80973b-262a-4136-9518-c48022491652
ここを読んだ限りではボタンを押すのは無理っぽいので
WM_NCHITTESTの戻り値でボタンを判断し
WM_SYSCOMMANDを送って処理するしかないっぽいです。
皆様ありがとうございました。
すいません解決ボタン押し忘れました。
しかもここうぜぇぇ場所で
馬鹿で雑魚だなああああああwwwwwww
俺が本物だよカスwwwwwww
おめぇぇはきめぇぇし
すぐ怒る怒るしwwww
もう隠しも無駄だ!!
おめぇはガキのくせに
生意気なんだよ
さっさとかかってこいよ!!
臆病者め!!!
逃げてるし馬鹿だなあww
おいおいww
何が「ありがとう」だとぉ?
認めねーよ雑魚!!!!
ツイート | ![]() |