PDA

View Full Version : سوال: فرستادن برنامه به تسک بار TaskBar



mohamad72
چهارشنبه 30 مرداد 1392, 19:11 عصر
سلام
من میخوام یه برنامه الارم بسازم که یه ساعت خاصی به کاربر هشدار بده
دو تا مشکل دارم:
مشکل اولم اینه که نمیدونم چجوری برنامه تو تسک بار باشه مثه نود 32 تا همیشه در حال اجرا باشه چون ممکنه توسط کاربر برنامه بسته شه.
مشکل دومم اینه که من باید یه تایمر بزارم که هر دقیقه چک کنه ببینه اون لحظه خاص رسیده یا نه نمیشه جور دیگه ای نوشت.مثلا یه رویداد زمانی نوشت.یعنی یه رویداد بنویسیم که وقوعش تو یه زمان خاص باشه

ali_khodayar
چهارشنبه 30 مرداد 1392, 19:21 عصر
سلام دوست عزیز. من هم دقیقأ دنبال نوشتن چنین برنامه ای بودم. تونستم برنامه رو به تسک بار بفرستم اما هنوز روی این رویداد زمانیش کار نکردم. برای اینکه برنامه در تسکبار اجرا بشه باید از NotfyIcon استفاده کنی . کد دقیق رو برات میزارم

البته برای قرار گرفتن در تسک بار احتیاجی به کد نیست فقط یه NotifyIcon به برنامه اظافه کنی کافیست. ایکن دلخواه رو هم میتونی انتخاب کنی .

mousa1992
چهارشنبه 30 مرداد 1392, 21:03 عصر
مشکل اولم اینه که نمیدونم چجوری برنامه تو تسک بار باشه مثه نود 32 تا همیشه در حال اجرا باشه چون ممکنه توسط کاربر برنامه بسته شه.
عذر میخوام اما واقعا همچین چیزی برا برنامه ای که میخواد الارم بده واقعا لازمه ؟!
برا رویداد زمانی که عرض کردین میتونید از توابع wmi استفاده کنید

mohamad72
پنج شنبه 31 مرداد 1392, 12:53 عصر
بله لازمه
اگه برنامه بسته باشه که دیگه نمیتونه الارم بده باید برنامه همیشه در حال اجرا باشه
NotifyIcon چیه میشه توضیح بدید

pouria_bayat
پنج شنبه 31 مرداد 1392, 13:01 عصر
NotifyIcon ابزارش توی ویژوال استودیو هستش ولی به صورت Dynamically:


using System;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.NotifyIcon notifyIcon1;
private System.Windows.Forms.ContextMenu contextMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.ComponentModel.IContainer components;

[STAThread]
static void Main()
{
Application.Run(new Form1());
}

public Form1()
{
this.components = new System.ComponentModel.Container();
this.contextMenu1 = new System.Windows.Forms.ContextMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();

// Initialize contextMenu1
this.contextMenu1.MenuItems.AddRange(
new System.Windows.Forms.MenuItem[] {this.menuItem1});

// Initialize menuItem1
this.menuItem1.Index = 0;
this.menuItem1.Text = "E&xit";
this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);

// Set up how the form should be displayed.
this.ClientSize = new System.Drawing.Size(292, 266);
this.Text = "Notify Icon Example";

// Create the NotifyIcon.
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);

// The Icon property sets the icon that will appear
// in the systray for this application.
notifyIcon1.Icon = new Icon("appicon.ico");

// The ContextMenu property sets the menu that will
// appear when the systray icon is right clicked.
notifyIcon1.ContextMenu = this.contextMenu1;

// The Text property sets the text that will be displayed,
// in a tooltip, when the mouse hovers over the systray icon.
notifyIcon1.Text = "Form1 (NotifyIcon example)";
notifyIcon1.Visible = true;

// Handle the DoubleClick event to activate the form.
notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick);

}

protected override void Dispose( bool disposing )
{
// Clean up any components being used.
if( disposing )
if (components != null)
components.Dispose();

base.Dispose( disposing );
}

private void notifyIcon1_DoubleClick(object Sender, EventArgs e)
{
// Show the form when the user double clicks on the notify icon.

// Set the WindowState to normal if the form is minimized.
if (this.WindowState == FormWindowState.Minimized)
this.WindowState = FormWindowState.Normal;

// Activate the form.
this.Activate();
}

private void menuItem1_Click(object Sender, EventArgs e) {
// Close the form, which closes the application.
this.Close();
}
}

پیشنهادم اینه که از Toolbax مربوط به ویژوالت اونرو توی فرم بکشی و با خصوصیاتش کار کنی برای شروع بهتره.
برای اینکه برنامه بسته نشه سعی کن خاصیت Style فرمت رو به NOne تغییر بدی و یک دکمه روی فرم برای Minimize کردن پنجره فرمت قرار بدی یا اینکه رویداد _FormClosing رو به شکل دلخواهت تغییر بده.

sohil_ww
پنج شنبه 31 مرداد 1392, 13:13 عصر
این بدردت می خوره
:چشمک:
دانلود (http://uplod.ir/vb9v173ykf0r/timer.zip.htm)

mohamad72
پنج شنبه 31 مرداد 1392, 14:09 عصر
مرسی عالی بود
تو تسک بار رفتن رو کامل بلد شدم با اینکه یه مشکلی هنوز هست اینم اینه که اگه یکی دو دفعه اپلیکیشن رو اجرا کرد دو تا ایکون تو تسک بار میاد ولی خودم بلدم یکاریش بکنم.

ولی رویداد زمانی رو هنوز متوجه نشدم باید چی کار کنم کسی بلده؟؟؟
چون میخوام یه سایت هم بزنم که مثلا هر روز 8صبح یه کاری بکنه ولی نمیدونم چجوری

sohil_ww
پنج شنبه 31 مرداد 1392, 14:32 عصر
رویداد زمانی رو هنوز متوجه نشدم

منظورت از رویداد زمانی چی هست ؟

mohamad72
پنج شنبه 31 مرداد 1392, 17:47 عصر
ینی همونطوری که یه رویداد مینویسیم که با کلیک کردن روی یه دکمه اتفاق میافته
یه رویداد بنویسیم که با رسیدن به یه ساعت از قبل تعیین شده اتفاق بیفته و دستورات رو انجام بده

m_ali_gho
پنج شنبه 31 مرداد 1392, 23:52 عصر
میشه از thread یا backgroundworker استفاده کرد. thread خیلی خوبه اما یه مشکلی داره. اگه بخوای از داخل thread که خودت اجراش می کنی (نه thread اصلی برنامه) کاری روی کنترل های فرم انجام بدی runtime eror به وجود میاد. که خوب اون باز راه حل خودشو داره. در مورد حل این مشکل فکر کنم استفاده از backgroundworker بهتر باشه. مثلا می تونی تو load برنامت یا هر جای دیگه backgroundworker رو راه بندازی و زمانت رو هم به عنوان آرگومان بفرستی بهش و تو رویداد backgroundworker_DoWork یه حلقه قرار بدی که یه شرطی رو چک کنه و در صورت محقق شدن شرط (رسیدن به اون زمان خاص) از حلقه خارج بشه. در رویداد backgroundworker_RunWorkComplate هم میتونی دستوراتی که مد نظرته رو قرار بدی. اگه فکر میکنی بدردت میخوره و نیاز داری بگو تا کدشو هم بذارم.

mohamad72
جمعه 01 شهریور 1392, 20:42 عصر
میشه از thread یا backgroundworker استفاده کرد. thread خیلی خوبه اما یه مشکلی داره. اگه بخوای از داخل thread که خودت اجراش می کنی (نه thread اصلی برنامه) کاری روی کنترل های فرم انجام بدی runtime eror به وجود میاد. که خوب اون باز راه حل خودشو داره. در مورد حل این مشکل فکر کنم استفاده از backgroundworker بهتر باشه. مثلا می تونی تو load برنامت یا هر جای دیگه backgroundworker رو راه بندازی و زمانت رو هم به عنوان آرگومان بفرستی بهش و تو رویداد backgroundworker_DoWork یه حلقه قرار بدی که یه شرطی رو چک کنه و در صورت محقق شدن شرط (رسیدن به اون زمان خاص) از حلقه خارج بشه. در رویداد backgroundworker_RunWorkComplate هم میتونی دستوراتی که مد نظرته رو قرار بدی. اگه فکر میکنی بدردت میخوره و نیاز داری بگو تا کدشو هم بذارم.


مرسی ولی این که تقریبا همون کنترل تایمر خودمونه دیگه اینجور که شما میگین
حالا کدشم بزارین ممنون میشم

m_ali_gho
جمعه 01 شهریور 1392, 20:56 عصر
خب این چیزی بو که به ذهن من میرسد.

فراخوانی backgroundworker:


DateTime myDate=???;
backgroundWorker1.RunWorkerAsync(myDate);



و رویداد های backgroundworker


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DateTime date = (DateTime)e.Argument;
while (true)
{
if (DateTime.Now == date)
break;
}
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//دستور آلارم
}

mohamad72
جمعه 01 شهریور 1392, 22:44 عصر
خب این چیزی بو که به ذهن من میرسد.

فراخوانی backgroundworker:


DateTime myDate=???;
backgroundWorker1.RunWorkerAsync(myDate);



و رویداد های backgroundworker


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DateTime date = (DateTime)e.Argument;
while (true)
{
if (DateTime.Now == date)
break;
}
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//دستور آلارم
}



مرسی خوب بود دست همگی درد نکنه