Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Вниз

Можно ли узнать координаты иконки в трее?   Найти похожие ветки 

 
Denis ©   (2005-07-14 13:22) [0]

Приветствую всех. Вопрос в теме...
Если можно, то какие функции нужно использовать?

Вообще задача - открывать форму с сообщением (в виде выноски) возле трея так, чтобы выноска всегда указывала на иконку приложения.


 
Игорь Шевченко ©   (2005-07-14 13:23) [1]

Нельзя, AFAIK


 
Slym ©   (2005-07-14 14:58) [2]

Зы типа БалонТип? Тебе никакого окна создавать не надо и координаты не нужны:

type
 TNotifyIconDataV5 =record
   cbSize: DWORD;
   hWnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..MAXCHAR] of AnsiChar;
   dwState: DWORD;
   dwStateMask: DWORD;
   szInfo: array [0..MAXBYTE] of AnsiChar;
   uTimeoutVersion:UINT;
   szInfoTitle: array [0..63] of AnsiChar;
   dwInfoFlags: DWORD;
 end;

const
 //uFlags
 NIF_INFO         = $00000010;

var NID:TNotifyIconDataV5;
begin
 NID.uFlags:=NID.uFlags or NIF_INFO;
 Move(PChar(Title)^,NID.szInfoTitle,Min(Length(Title),SizeOf(NID.szInfoTitle)));
 Move(PChar(Msg)^,NID.szInfo,Min(Length(Msg),SizeOf(NID.szInfo)));
 NID.uTimeoutVersion:=TimeOut* 1000;
 NID.dwInfoFlags:=InfoFlag;
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;


 
Пифагор   (2005-07-14 20:22) [3]

2 Игорь Шевченко ©   (14.07.05 13:23) [1]
Можно с помощью циркуля и линейки, в принципе можно обойтись и без циркуля


 
DVM ©   (2005-07-15 11:53) [4]

Под win95/98 практически невозможно, под Win2000/xp возможно, но там это и не нужно, т.к. есть возможность создавать такие выноски с пом БалонТайпов или на основе их.


 
Alexander Panov ©   (2005-07-15 12:37) [5]

Slym ©   (14.07.05 14:58) [2]
DVM ©   (15.07.05 11:53) [4]

А кто сказал, что автору нужно узнавать координаты иконки, созданной в своей программе?


 
Slym ©   (2005-07-15 13:59) [6]

Удалено модератором
Примечание: Хочешь поговорить, тогда в чат


 
Alexander Panov ©   (2005-07-15 16:30) [7]

Slym ©   (15.07.05 13:59) [6]
Ты отвечаещь на вопрос или хамищЪ отвечающим?


В чем дело?
Хочешь поговорить об этом?


 
Alexander Panov ©   (2005-07-15 16:32) [8]

Slym ©   (15.07.05 13:59) [6]
Согласен... Если ставить вопрос так: "Как програмно узнать координаты моей рожи на этой фотке" - то никак...


1. Про рожи на фотографии вопроса не было.

Slym ©   (15.07.05 13:59) [6]
Хотя системы распознования образов никто не отменял


Это к чему? Будем прикручивать FineReader?


 
DVM ©   (2005-07-17 17:10) [9]


> Alexander Panov ©   (15.07.05 12:37) [5]
> Slym ©   (14.07.05 14:58) [2]
> DVM ©   (15.07.05 11:53) [4]
>
> А кто сказал, что автору нужно узнавать координаты иконки,
> созданной в своей программе?

Я вообще то не про свою программу.


 
Denis ©   (2005-07-19 10:13) [10]

Добрался наконец сюда)
2 Slym: я читал о таких выносках в статьях DelphiWorld, но непонятно было, можно ли к ним прикрутить обработчики событий.
Потому и остановился на форме в виде выноски - если ее закрыть кнопкой приложение дальше переходит в режим ожидания, а двойной щелчок по ней раскрывает окно программы  с обновленными данными.
насколько я понял  БалонТайпы позволяют просто показать какой-то текст.


 
DVM ©   (2005-07-19 10:17) [11]


> насколько я понял  БалонТайпы позволяют просто показать
> какой-то текст.

Неправильно ты понял. Там могут быть кнопки и прочее.


 
Denis ©   (2005-07-19 12:16) [12]

2 DVM ©
Можешь подсказать где взять информацию о работе с ними?


 
DVM ©   (2005-07-19 15:13) [13]

как ни банально msdn


 
Slym ©   (2005-07-20 04:44) [14]

unit TrayIcon;

interface
uses windows,ShellAPI,messages,Classes,Graphics,Controls,SysUtils,Menus;

type
 TNotifyIconDataV5 =record
   cbSize: DWORD;
   hWnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..MAXCHAR] of AnsiChar;
   dwState: DWORD;
   dwStateMask: DWORD;
   szInfo: array [0..MAXBYTE] of AnsiChar;
   uTimeoutVersion:UINT;
   szInfoTitle: array [0..63] of AnsiChar;
   dwInfoFlags: DWORD;
 end;

const
 //uFlags
 NIF_STATE        = $00000008;
 NIF_INFO         = $00000010;
 NIF_GUID         = $00000020;

 //dwInfoFlags
 NIIF_NONE = $00000000;
 NIIF_INFO = $00000001;
 NIIF_WARNING = $00000002;
 NIIF_ERROR = $00000003;
 //NIIF_USER =

const
 WM_TOOLTRAYICON = WM_USER+1;
type
 TMouseEvent = procedure(Sender: TObject; Button: TMouseButton) of object;

 TTrayIcon=class(TComponent)
 private
   FHwnd:Longint;
   FIcon:TIcon;
   FToolTip:String;
   FVisible: boolean;
   FPopupMenu:TPopupMenu;
   FOnMouseDown: TMouseEvent;
   FOnMouseMove: TNotifyEvent;
   FOnMouseUp: TMouseEvent;
   FOnDblClick: TMouseEvent;

   procedure MessageProc(var Message: TMessage);
   procedure SetVisible(const Value: boolean);
   procedure SetToolTip(Value:String);
   procedure SetIcon(AIcon:TIcon);
   function IsIconStored: Boolean;
   procedure SetPopupMenu(const Value:TPopupMenu);
 protected
   procedure PrepareData(var NotifyIconData:TNotifyIconDataV5);virtual;
   procedure OnIconChange(Sender:TObject);
   procedure Notification(AComponent: TComponent; Operation: TOperation);override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure Show;
   procedure Hide;
   procedure ShowBallonTip(const Title,Msg:string;InfoFlag:integer=NIIF_INFO;TimeOut:integer=10);
 published
   property Icon:TIcon read FIcon write SetIcon stored IsIconStored;
   property ToolTip:String read FToolTip write SetToolTip stored true;
   property Visible:boolean read FVisible write SetVisible stored true;
   property PopupMenu:TPopupMenu read FPopupMenu write SetPopupMenu;
   property OnDblClick: TMouseEvent read FOnDblClick write FOnDblClick;
   property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
   property OnMouseMove: TNotifyEvent read FOnMouseMove write FOnMouseMove;
   property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp ;
 end;

procedure Register;

implementation

{ TTrayIcon }

constructor TTrayIcon.Create(AOwner: TComponent);
begin
 FIcon:=TIcon.Create;
 fIcon.OnChange:=OnIconChange;
 FHwnd:=AllocateHwnd(MessageProc);
 inherited;
end;

destructor TTrayIcon.Destroy;
begin
 Hide;
 DeallocateHWnd(FHwnd);
 FIcon.Free;
 inherited;
end;

function Min(A,B:integer):integer;
begin
 if A<=B then
   result:=A
 else
   result:=B;
end;

procedure TTrayIcon.PrepareData(var NotifyIconData:TNotifyIconDataV5);
begin
 FillChar(NotifyIconData,SizeOf(NotifyIconData),#0);
 NotifyIconData.cbSize:=SizeOf(NotifyIconData);
 NotifyIconData.uID:=integer(self);
 NotifyIconData.hWnd:=FHwnd;
 NotifyIconData.uCallbackMessage:=WM_TOOLTRAYICON;
 NotifyIconData.uFlags:=NIF_MESSAGE;
end;

procedure TTrayIcon.Show;
var NID:TNotifyIconDataV5;
begin
 if csDesigning in ComponentState then
 begin
   FVisible:=true;
   exit;
 end;
 if FVisible then exit;

 PrepareData(NID);
 if not FIcon.Empty then
 begin
   NID.hIcon:=FIcon.Handle;
   NID.uFlags:=NID.uFlags or NIF_ICON;
 end;
 if Length(FToolTip)>0 then
 begin
   Move(PChar(FToolTip)^,NID.szTip,Min(Length(FToolTip),SizeOf(NID.szTip)));
   NID.uFlags:=NID.uFlags or NIF_TIP;
 end;
 FVisible:=Shell_NotifyIcon(NIM_ADD,@NID);
end;

procedure TTrayIcon.Hide;
var NID:TNotifyIconDataV5;
begin
 if not FVisible then exit;
 PrepareData(NID);
 Shell_NotifyIcon(NIM_DELETE,@NID);
 FVisible:=false;
end;

procedure TTrayIcon.ShowBallonTip(const Title,Msg:string;InfoFlag:integer=NIIF_INFO;TimeOut:integer=10);
var NID:TNotifyIconDataV5;
begin
 if not FVisible then exit;
 PrepareData(NID);
 NID.uFlags:=NID.uFlags or NIF_INFO;
 Move(PChar(Title)^,NID.szInfoTitle,Min(Length(Title),SizeOf(NID.szInfoTitle)));
 Move(PChar(Msg)^,NID.szInfo,Min(Length(Msg),SizeOf(NID.szInfo)));
 NID.uTimeoutVersion:=TimeOut* 1000;
 NID.dwInfoFlags:=InfoFlag;
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;

procedure TTrayIcon.MessageProc(var Message: TMessage);
var CurPos:TPoint;
begin
 if Message.Msg<>WM_TOOLTRAYICON then exit;
 case Message.LParam of
   WM_MOUSEMOVE      : if assigned(FOnMouseMove) then FOnMouseMove(self);
   WM_LBUTTONDOWN    : if assigned(FOnMouseDown) then FOnMouseDown(self,mbLeft);
   WM_LBUTTONUP      : if assigned(FOnMouseUp) then FOnMouseUp(self,mbLeft);
   WM_LBUTTONDBLCLK  : if assigned(OnDblClick) then OnDblClick(self,mbLeft);
   WM_RBUTTONDOWN    :
     begin
       if assigned(FOnMouseDown) then
         FOnMouseDown(self,mbRight);
       If Assigned(FPopupMenu) then
       begin
         GetCursorPos(CurPos);
         FPopupMenu.Popup(CurPos.x,CurPos.y);
         PostMessage(FHWND,WM_USER,0,0);
       end;
     end;
   WM_RBUTTONUP      : if assigned(FOnMouseUp) then FOnMouseUp(self,mbRight);
   WM_RBUTTONDBLCLK  : if assigned(OnDblClick) then OnDblClick(self,mbRight);
   WM_MBUTTONDOWN    : if assigned(FOnMouseDown) then FOnMouseDown(self,mbMiddle);
   WM_MBUTTONUP      : if assigned(FOnMouseUp) then FOnMouseUp(self,mbMiddle);
   WM_MBUTTONDBLCLK  : if assigned(OnDblClick) then OnDblClick(self,mbMiddle);
 end;
end;

procedure TTrayIcon.OnIconChange(Sender: TObject);
var NID:TNotifyIconDataV5;
begin
 if not FVisible then exit;
 PrepareData(NID);
 NID.uFlags:=NID.uFlags or NIF_ICON;
 NID.hIcon:=FIcon.Handle;
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;

procedure TTrayIcon.SetToolTip(Value: String);
var NID:TNotifyIconDataV5;
begin
 FToolTip:=Value;
 if not FVisible then exit;


 
Slym ©   (2005-07-20 04:44) [15]

 PrepareData(NID);
 NID.uFlags:=NID.uFlags or NIF_TIP;
 if Length(FToolTip)>0 then
   Move(PChar(FToolTip)^,NID.szTip,Min(Length(FToolTip),SizeOf(NID.szTip)));
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;

procedure TTrayIcon.SetIcon(AIcon: TIcon);
begin
 FIcon.Assign(AIcon);
end;

procedure TTrayIcon.SetVisible(const Value: boolean);
begin
 if Value then
   Show
 else
   Hide;
end;

function TTrayIcon.IsIconStored: Boolean;
begin
 Result := Icon.Handle <> 0;
end;

procedure TTrayIcon.Notification(AComponent: TComponent; Operation: TOperation);
begin
 inherited Notification(AComponent,Operation);
 If (Operation=opRemove) and (AComponent=PopupMenu) then PopupMenu:=nil;
end;

procedure TTrayIcon.SetPopupMenu(const Value: TPopupMenu);
begin
 FPopupMenu:=Value;
 If Value<>nil then Value.FreeNotification(self);
end;

procedure Register;
begin
 RegisterComponents("Samples", [TTrayIcon]);
end;

end.


 
Джо ©   (2005-07-20 05:07) [16]


> [14] Slym ©   (20.07.05 04:44)

Новые лисапеды появились?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.01 c
2-1123015211
Pasha L
2005-08-03 00:40
2005.09.04
Скопировать, вставить, переименовать файлы


1-1124077500
Laymer
2005-08-15 07:45
2005.09.04
Word


3-1122373054
Yurisimus
2005-07-26 14:17
2005.09.04
База *.xls через ADO в Delphi


3-1121960535
Djek
2005-07-21 19:42
2005.09.04
Вывод неповторяющегося значения поля в ComboBox


1-1124184754
Term
2005-08-16 13:32
2005.09.04
Принципы написания простенького браузера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский