PDA

View Full Version : سوال: نحوه تشخیص اجرا شدن پروژه موقع شروع ویندوز یا توسط کاربر



md3848
شنبه 23 اسفند 1399, 19:43 عصر
سلام، برا پروژم قابلیت Startup رو فعال کردم تا موقع شروع ویندوز، پروژم اجرا بشه اما نمیخوام نمایش داده بشه، میخوام تو قسمت system-tray نمایش داده بشه.
مشکلی که دارم اینه که نمیدونم چطور تشخیص بدم که کاربر خودش پروژه رو اجرا کرده یا موقع Start-up ویندوز ( زمانی که کامپیوتر روشن شده تازه ) اجرا شده.

یه روش که به ذهنم میرسه اینه که up-time ( مقدار زمانی که از روشن شدن کامپیوتر میگذره ) رو بخونم و مثلا اگه کمتر از 1 دقیقه بود یعنی پروژم به وسیله startup اجرا شده؛ پروژه من تو ثانیه 28 شروع ویندوز اجرا میشه، مقداری تو این محدوده؛ ولی خب روش جالبی بنظرم نی، بنظرم باید روش بهتر و اصولی تری هم باشه.

public TimeSpan UpTime
{
get
{
using (var uptime = new PerformanceCounter("System", "System Up Time"))
{
// Call this an extra time before reading its value
uptime.NextValue();
return TimeSpan.FromSeconds(uptime.NextValue());
}
}
}

Mahmoud Zaad
شنبه 23 اسفند 1399, 20:18 عصر
سلام
آرگومان ورودی به نرم افزار رو در هر دو حالت بررسی کنید. در تابع Main در فایل Program.cs با یک حلقه، آرگومان های ورودی رو در دو حالت بررسی کنید.
این (https://stackoverflow.com/questions/30044503/detect-an-application-runs-by-user-click-or-windows-startup-in-c-sharp) پست رو ببینید

the king
شنبه 23 اسفند 1399, 20:37 عصر
سلام، برا پروژم قابلیت Startup رو فعال کردم تا موقع شروع ویندوز، پروژم اجرا بشه اما نمیخوام نمایش داده بشه، میخوام تو قسمت system-tray نمایش داده بشه.
مشکلی که دارم اینه که نمیدونم چطور تشخیص بدم که کاربر خودش پروژه رو اجرا کرده یا موقع Start-up ویندوز ( زمانی که کامپیوتر روشن شده تازه ) اجرا شده.

یه روش که به ذهنم میرسه اینه که up-time ( مقدار زمانی که از روشن شدن کامپیوتر میگذره ) رو بخونم و مثلا اگه کمتر از 1 دقیقه بود یعنی پروژم به وسیله startup اجرا شده؛ پروژه من تو ثانیه 28 شروع ویندوز اجرا میشه، مقداری تو این محدوده؛ ولی خب روش جالبی بنظرم نی، بنظرم باید روش بهتر و اصولی تری هم باشه.

public TimeSpan UpTime
{
get
{
using (var uptime = new PerformanceCounter("System", "System Up Time"))
{
// Call this an extra time before reading its value
uptime.NextValue();
return TimeSpan.FromSeconds(uptime.NextValue());
}
}
}

کاری که اغلب برنامه ها انجام می دهند اینه که برای شروع در System Tray یک سوئیچ ویژه تعریف می کنند که اگر در command line برنامه اون سوئیچ بکار بره مشخص بشه که قرار نیست پنجره اصلی برنامه بالا بیاد.
مثلا Free Download Manager و DAEMON Tools Lite با سوئیچ autorun- مشخص اش می کنند :


"C:\Program Files (x86)\Free Download Manager\fdm.exe" -autorun
"C:\Program Files\DAEMON Tools Lite\DTLite.exe" -autorun

یا مثلا Microsoft Xbox 360 Accessories با سوئیچ silentrun مشخص اش می کنه :


"C:\Program Files\Microsoft Xbox 360 Accessories\XboxStat.exe" silentrun

یا مثلا درایور Realtek Audio با سوئیچ s- مشخص اش می کنه :


"C:\Program Files\Realtek\Audio\HDA\RAVCpl64.exe" -s

یا مثلا Adobe Creative Cloud دو سوئیچ رو بکار می بره :


"C:\Program Files (x86)\Adobe\Adobe Creative Cloud\ACC\Creative Cloud.exe" --showwindow=false --onOSstartup=true

و اغلب سوئیچ ها اینها هستند :


-autorun
-silent
-quiet
-minimized
-startup
-s
/s
/autostart


می توانید در Program.cs یا هر فرمی این بررسی رو انجام بدهید.

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application. SetCompatibleTextRenderingDefault( false);
if (Array.IndexOf( Environment.GetCommandLineArgs() , "/autorun", 1) >= 0)
{
//Your Code
}
else
{
Application.Run( new Form1());
}
}
}



private void Form1_Load(object sender, EventArgs e)
{
if (Array.IndexOf( Environment.GetCommandLineArgs() , "/autorun", 1) >= 0)
{
//Your Code
}
}


در اون Shortcut ای که در Startup قرار می دهید سوئیچ مورد نظر رو به انتهای سطر فرمان اضافه خواهید کرد :
153132

md3848
شنبه 23 اسفند 1399, 22:03 عصر
ممنون

مشکل : یه موردی، خو اگه پروژه رو از ‎Shortcut اجرا نکرد و مستقیم به محل نصب رفت و اجرا کرد که داستان میشه اون وقت که...

نرم افزار فایروالم : چند تا برنامه رو بررسی کردم ولی از این روش بنظر میاد استفاده نکردن، فقط نرم افزار فایروالم این ویژگی رو داشت که خب این مشکلی که در بالا ذکر کردم رو این فایروالم داشت، یعنی از Shortcut اجراش میکردم، نرم افزار اجرا میشد ولی از محل نصب اجرا میکردم اجرا نمیشد و فقط تو system-try نمایش داده میشد.

IDM : نرم افزار idm ( همون دانلود منیجر ) بنظر از روشی که گفتید استفاده نکردن، برنامه رو از طریق شورتکات و محل نصب اجرا میکنم قشنگ اجرا میشه، موقع Startup هم مستقیم میره تو System-try، هیچ مشکلی هم نداره در ظاهر.


"...\Windows Firewall Control\wfc.exe" -mp

روش خوبی بنظر میاد، حدقل از اون روش من بهتره :قهقهه: ولی خب بازم روش بهتری نی؟ چون خیلی از برنامه های سیستم Start-up دارن ولی از این روشی که گفتید بنظر میاد استفاده نکردن؛ احتمالا اونا از روش دیگه ای استفاده میکنن

md3848
شنبه 23 اسفند 1399, 22:32 عصر
سلام
آرگومان ورودی به نرم افزار رو در هر دو حالت بررسی کنید. در تابع Main در فایل Program.cs با یک حلقه، آرگومان های ورودی رو در دو حالت بررسی کنید.
این (https://stackoverflow.com/questions/30044503/detect-an-application-runs-by-user-click-or-windows-startup-in-c-sharp) پست رو ببینید
این لینکو دیدم ولی تو پروژه من ( WPF .NET5 ) قسمت Command line arguments رو نداره. :گریه:

153133

the king
شنبه 23 اسفند 1399, 22:34 عصر
ممنون
مشکل : یه موردی، خو اگه پروژه رو از ‎Shortcut اجرا نکرد و مستقیم به محل نصب رفت و اجرا کرد که داستان میشه اون وقت که...

چه داستانی؟ موقعی که برنامه از Startup اجرا میشه با سوئیچ اجرا میشه و برنامه میفهمه که نباید پنجره نشون بده و وقتی از محل نصب اجرا بشه بدون سوئیچ اجرا میشه و برنامه میفهمه که باید پنجره اصلی رو نشون بده.


IDM : نرم افزار idm ( همون دانلود منیجر ) بنظر از روشی که گفتید استفاده نکردن، برنامه رو از طریق شورتکات و محل نصب اجرا میکنم قشنگ اجرا میشه، موقع Startup هم مستقیم میره تو System-try، هیچ مشکلی هم نداره در ظاهر.

نرم افزار IDM دقیقا از همون روش استفاده می کنه، اسم سوئیچ اش هم onboot/ ئه :


C:\Program Files (x86)\Internet Download Manager\IDMan.exe /onboot

نمیدونم منظورتون از قشنگ اجرا شدن چیه، اما قرار نیست چون سوئیچ برای برنامه تعریف می کنید دیگه از محل نصب اجرا شدنی نباشه یا موقع Startup در System Tray قابل نمایش نباشه.

the king
شنبه 23 اسفند 1399, 22:40 عصر
این لینکو دیدم ولی تو پروژه من ( WPF .NET5 ) قسمت Command line arguments رو نداره. :گریه:

153133
همون کادر Application arguments ئه، در ضمن برای تست کردن پروژه لازم نیست که واقعا آرگومان مشخص کنید، برای تست کردن هم می توانید موقتا کد شرط بررسی آرگومان رو برعکس بنویسید تا ببینید در حالت Startup چطور اجرا میشه و هم می توانید یک Shortcut برای برنامه بسازید و با اون اجرایش کنید.

md3848
شنبه 23 اسفند 1399, 22:47 عصر
چه داستانی؟ ...

من رو IDM کلیک راست کردم و گزینه آخرو (Properties) رو زدم، نتیجه شد این (انتهای آدرس نه startup یی هستش نه onboot یی و نه هیچ چیز دیگه ای)

153134


این هم مربوطه به نرم افزار فایروال من که از روش شما استفاده کرده انگار :

153135

الان نرم افزار فایروالم ( که از روش شما استفاده کرده انگار ) به کمک شورتکات اجراش کنم، نرم افزار اجرا میشه و در دستکتاپ نمایش داده میشه، اما اگه به محل نصبش برم و از اونجا اجراش کنم تو دسکتاپ چیزی نمایش نمیده ( چون اون کامند -mp رو نداره این فایل اجرایی داخل محط نصب نرم افزار و فقط شورتکات توی دسکتاپ این کامند رو داره ) و فقط تو قسمت System-try نمایش داده میشه نرمافزار فایروالم ( چون وقتی میبینه کامند -mp وجود نداره پس فک میکنه که نرم افزار از طریق Start-up شروع ویندوز اجرا شده فلذا تو دسکتاپ نمایشش نمیده و مستقیم نرم افزارو تو قسمت System-try فقط نشون میده )

the king
شنبه 23 اسفند 1399, 23:25 عصر
من رو IDM کلیک راست کردم و گزینه آخرو (Properties) رو زدم، نتیجه شد این (انتهای آدرس نه startup یی هستش نه onboot یی و نه هیچ چیز دیگه ای)

153134

آخه جای اشتباهی رو دنبال سوئیچ گشتید. اون سوئیچ رو تعریف کرده که موقع اجرای Startup ازش استفاده کنه، اون Shortcut یا آیتم منو که شما قراره باهاش IDM رو اجرا کنید که نباید اون سوئیچ داشته باشه، اگه داشت که دیگه IDM چطور میفهمید کاربر اجراش می کنه. کاربر قرار نیست اون سوئیچ رو بکار ببره. باید صرفا موقع اجرای Startup سوئیچ مورد نظر بکار بره.
ترکیب کلیدی کلید ویندوز + کلید R رو فشار دهید تا پنجره Run باز بشه و با نوشتن و OK کردن عبارت regedit برنامه Registry Editor ویندوز رو اجرا کنید.
153138
در مسیر HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run می توانید اون کلید IDMan و سوئیچ onboot/ اش رو ببینید :
153137


این هم مربوطه به نرم افزار فایروال من که از روش شما استفاده کرده انگار :

153135



الان نرم افزار فایروالم ( که از روش شما استفاده کرده انگار ) به کمک شورتکات اجراش کنم، نرم افزار اجرا میشه و در دستکتاپ نمایش داده میشه، اما اگه به محل نصبش برم و از اونجا اجراش کنم تو دسکتاپ چیزی نمایش نمیده ( چون اون کامند -mp رو نداره این فایل اجرایی داخل محط نصب نرم افزار و فقط شورتکات توی دسکتاپ این کامند رو داره ) و فقط تو قسمت System-try نمایش داده میشه نرمافزار فایروالم ( چون وقتی میبینه کامند -mp وجود نداره پس فک میکنه که نرم افزار از طریق Start-up شروع ویندوز اجرا شده فلذا تو دسکتاپ نمایشش نمیده و مستقیم نرم افزارو تو قسمت System-try فقط نشون میده )
فایروال تون درست برعکس برای نمایش Main Panel اش سوئیچ تعریف کرده. یعنی حالت پیشفرض رو بدون نمایش پنجره در نظر گرفته.
در صفحه 7 راهنماش (Program parameters) توضیح داده :
https://www.binisoft.org/pdf/guides/Malwarebytes-WFC-User-Guide.pdf

md3848
یک شنبه 24 اسفند 1399, 00:26 صبح
اها حله، اما اصل داستان، این کد منه :

public MainWindow()
{
InitializeComponent();


// Windows StartUp
if (!StartUpManager.IsApplicationExistInCurrentUserSt artup("Islamic Program v1"))
{
StartUpManager.AddApplicationToCurrentUserStartup( "Islamic Program v1");
}


if (Array.IndexOf(Environment.GetCommandLineArgs(), "autorun", 1) >= 0)
{
TaskbarHide();
Title = "+autorun";
}
else
{
Title = "-autorun";
}
}


تنها زمانی که از طریق خود ویژوال استدیو پروژه رو اجرا میکنم، عنوان پروژم میشه "+autorun" و در بقیه حالات ( وقتی فایل exe از مسیر bin\Debug\net5.0-windows\WpfApp4.exe اجرا میکنم، وقتی شرتکات فایل exe فوق رو اجرا میکنم، وقتی سیستم رو ریست میکنم و خودش اجرا میشه ) عنوان صفحه "-autorun" میشه.

یعنی موقع ریست کردن ویندوز و بالا اومدن دوباره ویندوز ( موقع startup ویندوز ) نرمافزار من نمایش داده میشه و غیب نمیشه و به قسمت system-tray نمیره؛ به عبارت دیگه اون شرط که در کد بالا میبینی مقدارش False هستش درحالی که توقع دارم که در startup ویندوز مقدارش true باشه.

مشکل من از کجاس؟

153139


153141

the king
یک شنبه 24 اسفند 1399, 00:51 صبح
اها حله، اما اصل داستان، این کد منه :

public MainWindow()
{
InitializeComponent();


// Windows StartUp
if (!StartUpManager.IsApplicationExistInCurrentUserSt artup("Islamic Program v1"))
{
StartUpManager.AddApplicationToCurrentUserStartup( "Islamic Program v1");
}


if (Array.IndexOf(Environment.GetCommandLineArgs(), "autorun", 1) >= 0)
{
TaskbarHide();
Title = "+autorun";
}
else
{
Title = "-autorun";
}
}


تنها زمانی که از طریق خود ویژوال استدیو پروژه رو اجرا میکنم، عنوان پروژم میشه "+autorun" و در بقیه حالات ( وقتی فایل exe از مسیر bin\Debug\net5.0-windows\WpfApp4.exe اجرا میکنم، وقتی شرتکات فایل exe فوق رو اجرا میکنم، وقتی سیستم رو ریست میکنم و خودش اجرا میشه ) عنوان صفحه "-autorun" میشه.

یعنی موقع ریست کردن ویندوز و بالا اومدن دوباره ویندوز ( موقع startup ویندوز ) نرمافزار من نمایش داده میشه و غیب نمیشه و به قسمت system-tray نمیره؛ به عبارت دیگه اون شرط که در کد بالا میبینی مقدارش False هستش درحالی که توقع دارم که در startup ویندوز مقدارش true باشه.

مشکل من از کجاس؟

153139


153141

مقدار اون Islamic Program v1 (حالا چه با کد #C ایجادش می کنید و چه دستی نوشته اید باید بشه F:\...\WpfApp4.exe" autorun"
یعنی مقدار فعلی رو ویرایش کنید، هم اول و هم آخرش کاراکتر " اضافه کنید و در انتهایش بعد از یک فاصله autorun رو بنویسید.

md3848
یک شنبه 24 اسفند 1399, 01:10 صبح
خب مشکل حل شد. الان پروژم درست کار میکنه.


public static void AddApplicationToCurrentUserStartup(string ApplicationName)
{
using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
{
key.SetValue(ApplicationName, """ + Process.GetCurrentProcess().MainModule.FileName + """ + " -startup");
}
}


اینم از رجیستری که ایجاد میشه به کمک تابع بالا :

153142

فقط یه موردی، این Application arguments ( که در پست قبلی عکسشو قرار دادم ) نقش هویج داره که! :متفکر:

the king
یک شنبه 24 اسفند 1399, 05:49 صبح
خب مشکل حل شد. الان پروژم درست کار میکنه.
فقط یه موردی، این Application arguments ( که در پست قبلی عکسشو قرار دادم ) نقش هویج داره که! :متفکر:

نه. هویج نیست. برنامه نویس ممکنه بخواد در ویژوال استدیو اجرای برنامه رو با آرگومان های مشخصی امتحان و Debug کنه، تنظیم اون Application arguments ساده ترین راهه.