Если надо именно отобразить...
| Код | procedure TForm1.Button1Click(Sender: TObject); var p:TPoint; begin GetCursorPos(p); Timer1.Enabled:=true; PopupMenu1.Popup(p.X,p.Y); end;
procedure TForm1.Timer1Timer(Sender: TObject); var p:TPoint; R:TRect; i,k:integer; j:DWord; M:HMenu; V:HWND; begin Timer1.Enabled:=false; for i:=0 to GetMenuItemCount(PopupMenu1.Handle)-1 do begin j:=GetMenuItemID(PopupMenu1.Handle,i); if j=$FFFFFFFF then begin M:=GetSubMenu(PopupMenu1.Handle,i); if M<>0 then begin while (FindWindow('SysShadow',nil)=0) do; v:=FindWindow('#32768',nil); GetWindowRect(v,R); k:=Trunc((R.Bottom-R.Top)/GetMenuItemCount(PopupMenu1.Handle)); p.Y:=R.Top-(k div 2)+GetMenuItemCount(PopupMenu1.Handle)*k; p.X:=R.Left+(R.Right-R.Left) div 2; SetCursorPos(p.X,p.Y); end; end; end; end; |
PS: Если у тебя нет тени у меню... то строчки | Код | while (FindWindow('SysShadow',nil)=0) do; v:=FindWindow('#32768',nil); | надо заменить на | Код | //pID,tID:DWord; tID:=0; GetWindowThreadProcessId(Form1.Handle,@tID); v:=0; while (v=0) do begin v:=FindWindow('#32768',nil); pID:=0; GetWindowThreadProcessId(v,@pID); if tID<>pID then v:=0 end;
|
PS: Хотя... лудше сдалать перечисление окон и сверять наше... не наше... |