お世話になります。フォームのマウスダウンイベントでポップアップメニューを表示させ、ポップアップメニューの外でマウスアップしたときにポップアップメニューを消す方法教えてください。
真琴:「MouseDownでPopupMenuを出した時は MouseUpイベントが起きないの?」
春子:「そうね、だから MouseUpイベントで消せないというコトかな?」
真琴:「ハルコさん、じゃぁ、MouseHookしたらウマクいくンじゃない?」
春子:「まぁ、その手もあるけど…、それでやってみたら? マコト」
真琴:「それなら…こんなカンジでどうかなぁ?」
var
HookHandle: HHOOK;
function MouseHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
if (Code >= 0)and(Code = HC_ACTION) then begin
if {(WParam = WM_LBUTTONUP)or}(WParam = WM_RBUTTONUP) then begin
if HookHandle <> 0 then begin
UnHookWindowsHookEx(HookHandle);
HookHandle := 0;
keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
end;
end;
end;
result := CallNextHookEx(HookHandle, Code, WParam, LParam);
end;
procedure TForm1.WmRButtonDown(var Msg: TMessage);
var P: TPoint;
begin
inherited;
if HookHandle = 0 then
HookHandle := SetWindowsHookEx(WH_MOUSE, MouseHook, 0, GetCurrentThreadID);
P := ClientToScreen(Point(Msg.LparamLo, Msg.LparamHi));
PopupMenu1.Popup(P.X, P.Y);
end;
真琴:「うん、OK、RButtonDownでPopupして、外でのMouseUpでメニューが消えるヨ」
春子:「マコト、忘れてる、これだけじゃぁメニュー項目を選択しても無効になっちゃうでしょ?」
真琴:「あっ、そっか、MouseUpした場所の判定を忘れてた^^;」
春子:「そうよ、それがなくちゃね、…話違うけど、あれも忘れてるよ」
真琴:「え? ナンだっけ…」
春子:「もう一度バンの整備してってマサルさんに念を押さなきゃ、エンストしないように」
真琴:「でも、アタシにはドコが悪いか分からないし、やっぱり途中で止まると思うけど^^;」
春子:「それでも行くの? ディズニーランドへ」
真琴:「クルマを押すのも夏のイイ思い出になるよ」
春子:「アタシはそんな思い出はお断り、ユウコちゃんだってそうよ」
真琴:「だから、このコトはユウコには内緒、言わないでネ? ハルコさん」
春子:「言わないけど、アタシはゼッタイ行かないからね」
真琴:「でも、結局ハルコさんも一緒に行くコトになるンだから^^;」
ツイート | ![]() |