-
Доброго времени суток! Уважаемые мастера, помогите решить проблему: Проблема: вызываю попменю (окно в трее), меню норм отображается, обрабатываю все клики в меню, но... меню не исчезает, если клик был на другом окне, или вне области меню. т.е. оно видно, пока на нем не нажмешь на какой нибудь пункт.
За код прошу не пинать, пишу на Api в первый раз. Заранее спс.
Var P : TPoint; I, I2, I3 : Integer; GWnd : HWnd; Buffer : Array [0..127] Of Char; TempWinStr : Array [0..127] Of String; PAC : PAnsiChar; Begin MenuClear; I := 0; GWnd := GetWindow(Wnd, gw_HWndFirst); For I2 := 0 To GWnd do Begin IF (GWnd <> Wnd) AND //ñîïñíà îêíî (IsWindowVisible(GWnd)) AND //âñå âèäèìûå (GetWindow(GWnd, gw_Owner) = 0) AND //íå äî÷åðíèå (GetWindowText(GWnd, Buffer, sizeof(Buffer)) <> 0) AND //áåç çàãîëîâêà (Buffer <> 'Program Manager')THEN //åñëè íå ìåíåäæåð çàäà÷ BEGIN GetWindowText(GWnd, Buffer, sizeof(Buffer)); CreateMenuItem (Menu, 0, Buffer, 0, I + 100, false, False); Inc (I); END; GWnd := GetWindow(GWnd, gw_hWndNext); END;
I3 := 0; For I2 := 0 To 127 Do If WinStr [I2] <> '' Then Begin PAC := PChar (WinStr [I2]); GWnd := FindWindow (Nil, PAC); If (GWnd <> 0) And Not (IsWindowVisible(GWnd)) Then Begin TempWinStr [I3] := WinStr [I2]; Inc (I3); End; End Else Break;
For I2 := 0 To 127 Do Begin WinStr [I2] := TempWinStr [I2]; If TempWinStr [I2] = '' Then Break; CreateMenuItem (Menu, 0, PChar (WinStr [I2]), 0, I + 100, false, True); Inc (I); TempWinStr [I2] := ''; End;
CreateMenuItem (Menu, 0, '', 0, 99, True, False); CreateMenuItem (Menu, 0, 'Âûõîä', 0, 500, false, False); GetCursorPos (P); // DrawMenuBar (Menu); TrackPopUpMenu (Menu, TPM_LEFTALIGN, P.X, P.Y, 0, WND, Nil);
Function CreateMenuItem (Menu, SubMenu : HMenu; Cap : PAnsiChar; _Uid, _Wid : Uint; Sep, Checked : Boolean) : Boolean; Var MII : MenuItemInfo; Begin MII.cbSize := SizeOf (MII); //âûäåëÿåì ïàìÿòü MII.fMask := //MIIM_FTYPE or MIIM_STATE or MIIM_STRING;
Miim_State Or Miim_Type Or //Miim_SubMenu Or //ñóáìåíþ Miim_ID; //ócòàíàâëèâàåì ÈÄ If Not Sep Then //Åñëè íå íàäà ñåïàðàòîð, òî MII.fType := MFT_String // ïîêàçûâàåì ïðîñòî ñòðîêó Else MII.fType := MFT_Separator; //çíà÷èòü ðàçäåëèòåëü If Checked Then MII.fState := MFS_Enabled or MFS_CHECKED //ìåíþ âêëþ÷åíî Else MII.fState := MFS_Enabled; MII.wID := _Wid; //èä ìåíþ MII.hSubMenu := SubMenu; MII.dwItemData := 0; MII.dwTypeData := Cap; //còðîêà ìåíþ MII.cch := SizeOf (Cap);//ïàìÿòü äëÿ íàçâàíèÿ InsertMenuItem (Menu, _Uid, False, MII); End;
Menu := CreatePopUpMenu; //Ñîçäàåì ìåíþ //çàïîëíÿåì ñòðóêòóðó TWndClassEx äëÿ ìåíþ************************************ TWCE.cbSize := SizeOf (TWCE); //îïðåäåëÿåì ðàçìåð äëÿ ñòðóêòóðû TWCE.style := CS_HREDRAW or //ïåðåðèñîâûâàò 252; ïðè ãîðèçîíòàëüíî 236; èçìåíåíèè ðàçìåðà îêíà CS_VREDRAW or //ïðè âåðòèêàëüíîì CS_DBLCLKS; //îáðàáîòàêà äâîéíîãî êëèêà, ë.êëèêà è ï.êëèêà TWCE.lpfnWndProc := @WindowProc; //óêàçàòåëü íà îêîííóþ ôóíêó TWCE.cbClsExtra := 0; //äîï áàéòû íå íàäà TWCE.cbWndExtra := 0; //äîï áàéòû íå íàäà TWCE.hInstance := HInstance; //ïðîã ìîäóëü TWCE.hbrBackground := Color_Window; //çàëèâêà TWCE.lpszMenuName := @Menu; //èìÿ ìåíþ TWCE.lpszClassName := WndClass; // TWCE.hIcon := LoadIcon (0, IDI_Application);//èêîíêà, íàõ? TWCE.hCursor := LoadCursor (0, IDc_Arrow); //êóðñîð RegisterClassEx (TWCE); //ðåãèñòðèðóåì êëàññ //******************************************************************** ********
|