PDA

View Full Version : Go to Tray



Mahmood_M
چهارشنبه 03 اسفند 1384, 20:17 عصر
من از فانکشن زیر برای رفتن به System Try برنامه استفاده می کنم ...
مشکل اینجا است که وقتی به Try می ره آیکونی از برنامه من در System Try دیده نمی شه و نمی تون دوباره اون رو برگردونم ...
لطفا راهنماییم کنید ...
اینم کدش :

function MinimizeToTray(Handle: HWND): Boolean;
var
hwndTray: HWND;
rcWindow: TRect;
rcTray: TRect;
begin
if IsWindow(Handle) then
begin
hwndTray := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'TrayNotifyWnd', nil);
if (hwndTray = 0) then
Result := False
else
begin
GetWindowRect(Handle, rcWindow);
GetWindowRect(hwndTray, rcTray);
DrawAnimatedRects(Handle, IDANI_CAPTION, rcWindow, rcTray);
ShowWindow(Handle, SW_HIDE);
end;
end
else
Result := False;
end;

Hamid_PaK
پنج شنبه 04 اسفند 1384, 06:45 صبح
آیا ایکون برنامه شما در Tray وجود داره ؟؟؟ اگر نه ، یک ایکون در Tray قرار بدهید و در رویداد OnMouseClick و یا OnMouseDown فرم اصلی رو برگردانید ( Restore ) ...

( برای Tray می توانید از کامپوننت CoolTrayIcon استفاده کنید )

یا حق !!!

vcldeveloper
پنج شنبه 04 اسفند 1384, 06:59 صبح
کد شما فقط برای ایجاد یک حالت انیمیشن در برنامه کاربرد داره و عملا آیکنی به System Tray اضافه نمیکنه. برای این منظور باید از تابع Shell_NotifyIcon استفاده کنید. ایجاد آیکن در System Tray قبلا در این سایت و سایت های دیگه توضیح داده شده. از همون کامپوننت CoolTrayIcon هم می تونید استفاده کنید. اگر هم از دلفی 2006 استفاده می کنید، این نسخه بصورت استاندارد با خودش یک کامپو ننت برای این کار داره.

Ehsansh
پنج شنبه 04 اسفند 1384, 07:55 صبح
این کدی هست که من برای برنامه هام ازش استفاده میکنم:


Var NotifyIconData : TNotifyIconData;

with NotifyIconData do
begin
hIcon := Application.Icon.Handle;
StrPCopy(NotifyIconData.szTip, Application.Title);
Wnd := Handle;
uCallbackMessage := WM_User+1;
uID := 1;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
cbSize := sizeof(TNotifyIconData)
end;

Shell_NotifyIcon(NIM_ADD,@NotifyIconData);
Shell_NotifyIcon(NIM_DELETE,@NotifyIconData);
Shell_NotifyIcon(NIM_MODIFY,@NotifyIconData);

امیدوارم کمک کنه

Mahmood_M
پنج شنبه 04 اسفند 1384, 14:40 عصر
برای Tray می توانید از کامپوننت CoolTrayIcon استفاده کنید
این کامپوننت رو از کجا می تونم گیر بیارم ؟


این کدی هست که من برای برنامه هام ازش استفاده میکنم:


Var NotifyIconData : TNotifyIconData;

with NotifyIconData do
begin
hIcon := Application.Icon.Handle;
StrPCopy(NotifyIconData.szTip, Application.Title);
Wnd := Handle;
uCallbackMessage := WM_User+1;
uID := 1;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
cbSize := sizeof(TNotifyIconData)
end;

Shell_NotifyIcon(NIM_ADD,@NotifyIconData);
Shell_NotifyIcon(NIM_DELETE,@NotifyIconData);
Shell_NotifyIcon(NIM_MODIFY,@NotifyIconData);


اگه یه خورده در مورد طرز استفاده از این کدها توضیح بدید ممنون می شم...

Hamid_PaK
پنج شنبه 04 اسفند 1384, 15:21 عصر
دوست عزیز این کامپوننت رایگان هست .. تو گوگل یه سرچ بزن، حتما پیداش می کنی ...

و کدی که دوست عزیز آقا احسان فرمودند، به یوزز ShellAPI مربوط می شه :


uses ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
NotifyIcon: TNotifyIconData;
begin
with NotifyIcon do begin
cbSize := SizeOf(NotifyIcon);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;
hIcon := Application.Icon.Handle;
StrPCopy(szTip, Caption);
end;
Shell_NotifyIcon(NIM_ADD, @NotifyIcon);
end;



یا حق !!!

Hamid_PaK
پنج شنبه 04 اسفند 1384, 15:56 عصر
با کمی تغییرات ...


function MinimizeToTray(Restore: Boolean = False): Boolean;
var
hwndMain,
hwndTray: HWND;
rcWindow,
rcTray: TRect;
begin
Result := False;
hwndMain := Application.MainForm.Handle;
if IsWindow(hwndMain) then
begin
hwndTray := FindWindow('Shell_TrayWnd', nil);
hwndTray := FindWindowEx(hwndTray, 0, 'TrayNotifyWnd', nil);
hwndTray := FindWindowEx(hwndTray, 0, 'SysPager', nil);
hwndTray := FindWindowEx(hwndTray, 0, 'ToolbarWindow32', nil);
if hwndTray = INVALID_HANDLE_VALUE then Exit;
GetWindowRect(hwndMain, rcWindow);
GetWindowRect(hwndTray, rcTray);
if not Restore then begin
Result := DrawAnimatedRects(hwndMain, IDANI_CAPTION, rcWindow, rcTray);
if Result then Application.MainForm.Hide;
end else begin
Result := DrawAnimatedRects(hwndMain, IDANI_CAPTION, rcTray, rcWindow);
if Result then Application.MainForm.Show;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MinimizeToTray;
Sleep(1500);
MinimizeToTray(True)
end;



یا حق !!!

Mahmood_M
جمعه 05 اسفند 1384, 02:29 صبح
آقا حمید دست شما درد نکنه ، اون کامپوننت رو پیدا کردم ولی متاسفانه نتونستم نصبش کنم ...
راستش نمی دونم مشکلم کجاست !! ( آخه من زیاد کامپوننت نصب نمی کنم ) !!
این کامپوننت رو اینجا می زارم ، هرکی دانلود و نصب کرد به من هم یاد بده.
اگه مراحل نصب یک کامپوننت رو مثلا با چندتا عکس توضیح بده خیلی عالی می شه...
کار ساده اییه ولی شرمنده نتونستم نصبش کنم.
در ضمن به راهنمایی دلفی هم سر زدم ولی زیاد دستگیرم نشد.
اینم کامپوننت :
2547

Hamid_PaK
جمعه 05 اسفند 1384, 06:38 صبح
یکی از راه های نصب کامپوننت از راه خود پکیج آماده ای است که برنامه نویسان اون رو ساخته اند ...
اگر پکیج نداشت هم می تونید خودتون یکی براش ایجاد کنید و یا از راه ساده تری در پکیج آماده خود دلفی اضافه اش کنید :
1 - از منوی کامپوننت گزینه ( Install Component ) را انتخاب کنید، منوی نصب کامپوننت باز می شود.
2 - این منو حاوی دوتا، تب است که اولی مربوط به پکیج آماده و دومی برای ایجاد پکیج جدید است.
2-1 - فیلد اول نام و آدرس یونیت های است که شما می خواهید نصب شوند ( بعضی کامپوننت ها حاوی بیش از یک یونیت هستند پس بهتر است در یک فولدر جداگانه ای ذخیره شوند ).
2-2 - فیلد دوم مسیرهای است که دلفی یونیت ها در خواستی شما را در آنها جستجو می کند.
2-3 - فیلد سوم نام آدرس پکیجی است که شما می خواهید این یونیت ها در آن مجموعه قرار بگیرد ( دلیل اینکه ما یونیتها رو در پکیج های جداگانه نصب می کنیم برای سهولت در نصب و یا پاک کردن آنهاست و یا این که یونیتها در یک مجموعه هستند ).
2-4 - فیلد چهارم و آخرین فیلد مربوط به توضیحات پکیج است که در صورت ایجاد پکیجی جدید در تب ایجاد پکیج قابل تعریف است.
3 - بر روی دکمه جستجو ( Browse ) کلیک کرده و یونیتهای مورد نظر رو انتخاب می کنیم.
4 - در حال حاضر تمامی یونیتهای انتخاب شده باز شده و دلفی پیغام کامپایل مجدد پکیج رو نمایش می دهد در صورت اینکه خطایی در مجموعه یونیتهای جدید یافت نشود یونیتها در پکیج نصب شده و پیغامی با عنوان اینکه پالت کامپوننتها بروز شده و نتیجه پکیج انتخاب شده ثبت شدن کدامیک کمپوننتها است دیده می شود.

یا حق !!!

Mahmood_M
جمعه 05 اسفند 1384, 19:54 عصر
آقا حمید با توضیحات شما تا یه جاهایی پیش رفتم، ولی موقع کامپایل کردن چندتا Error می ده
http://mehri.persiangig.com/image/Delphi%20Pictures/Erors.jpg

قبل از اینکه به قسمت کامپایل برسم هم یک پیغام ظاهر می شود ( شکل زیر ).
http://mehri.persiangig.com/image/Delphi%20Pictures/Message.jpg
راستش هر کاری می کنم نمی تونم به این پیغام ( عکس بالا ) جواب درست بدم و همیشه کنسلش می کنم.

مورد اولی که گفتم ( Errors ) فقط در موقعییه که هر چهار تا یونیت رو وارد می کنم.
ولی با وارد کردن یکی از یونیتها این کامپوننت نصب می شه ولی فکر نکنم کامل باشه
عکس قسمت Properties این کامپوننت :
http://mehri.persiangig.com/image/Delphi%20Pictures/Properties.jpg
در قسمت Events هم چیزی نداره !!!
اگه بازم راهنماییم کنید ممنون می شم ( شرمنده ).:خجالت: :خجالت: :خجالت: :خجالت:

یه چیز دیگه : اگه به قسمت Project توی عکس وسطی نگاه کنید، نوشته CoolTrayIcon_D6plus.dpk ، فکر کنم این کامپوننت برای دلفی 6 باشه. ( من از دلفی 7 استفاده می کنم )

Hamid_PaK
جمعه 05 اسفند 1384, 20:25 عصر
اینو تست کنید ...

از منوی Component / Install Packages / Add فایل CoolTrayIcon_D7.bpl رو انتخاب کنید ...

یا حق !!!

Mahmood_M
جمعه 05 اسفند 1384, 22:35 عصر
آقا حمید عزیز دیگه لازم نیست ( نصبش کردم ).
یه کامپوننت دیگه گیر آوردم ( محصولی از SalarSoft ) خیلی راحت نصبش کردم.
امکانات خیلی خوبی هم داره
اگه بخواید می تونم ضمیمش کنم.
بازم از شما و سایر دوستان به خاطر راهنماییهایی که کردید تشکر می کنم.

یه چیز دیگه :
حالا می خوام برنامه من در شروع ویندوز اجرا بشه و به Tray بره ولی وقتی که یک نفر دستی اجراش میکنه این اتفاق نیافته ( موقع اجرا به Tray نره ).
اینو بلدم که کاری کنم موقع شروع ویندوز اجرا بشه ، ولی نمی دونم چه جوری به Tray بفرستمش ( فقط در شروع ویندوز ).

vcldeveloper
شنبه 06 اسفند 1384, 06:26 صبح
حالا می خوام برنامه من در شروع ویندوز اجرا بشه و به Tray بره ولی وقتی که یک نفر دستی اجراش میکنه این اتفاق نیافته ( موقع اجرا به Tray نره ).

در برنامه یک پارامتر برای Command Line تعریف کنید (مثلا : C:\MyProg.exe /startup). مقدار و تعداد پارامترهای خط فرمان را می تونید با استفاده از ParamStr و ParamCount بدست بیارید.
در OnCreate فرم اصلی برنامه چک کنید که آیا /startup به عنوان پارامتر خط فرمان به برنامه فرستاده شده یا نه. اگر فرستاده شده بود، ایکن برنامه را در System Tray قرار بدید و فرم برنامه را Hide کنید، در غیر این صورت برنامه را بصورت عادی اجرا کنید.