PDA

View Full Version : چطور در یک برنامهء C/C++‎/Qt بفهمیم که آیا Screen saver در حال اجراست یا خیر؟



eshpilen
شنبه 28 تیر 1393, 09:13 صبح
روی ویندوز XP sp3.
من سعی کردم برنامهء خط فرمان ویندوز به اسم tasklist رو بوسیله QProcess در Qt اجرا کنم تا ببینم موقعی که Screen saver در حال اجراست چه برنامهء خاصی توی لیست پراسسها وجود داره، ولی نمیدونم چرا وقتی tasklist رو از طریق برنامه اجرا میکنم و نه مستقیما از خط فرمان ویندوز، هیچ خروجی ای نمیده!
بجای QProcess از تابع system خود C برای اجرای tasklist استفاده کردم اما با اونم همین نتیجه رو گرفتم! یعنی هیچ خروجی ای نمیده.
برای تست مثلا این رو امتحان کردم:

system("tasklist > out.txt")
اما فایل out.txt که ایجاد میشه خالیه!

پس دو سوال وجود داره. یکی اینکه چرا وقتی tasklist رو از داخل برنامه اجرا میکنم خروجی نمیده، سوال دیگر اینکه چطور میشه فهمید که Screen saver در حال اجراست؟ ساده ترین راهش چیه؟ حالا با یه چیزی غیر از tasklist هم بالاخره کارمون راه میفته :چشمک:

returnx
شنبه 28 تیر 1393, 15:14 عصر
در مورد سوال اول من با این کد تست کردم و جواب داد:

QProcess i_process;
i_process.start("tasklist");
i_process.waitForFinished(-1);
QMessageBox i_msgbox;
QString result=QString(i_process.readAllStandardOutput());
i_msgbox.setText(result);
i_msgbox.exec();
در مورد سوال دوم هم میتونید از این تکه کد در یک تایمر استفاده کنید :

BOOL bSaver;
if (SystemParametersInfo (SPI_GETSCREENSAVERRUNNING,0,&bSaver,0))
{
if (bSaver)
{
qDebug("SCR!");
}
}

eshpilen
یک شنبه 29 تیر 1393, 08:53 صبح
فهمیدم که چرا اجرای tasklist واسه من جواب نمیداد!
من برنامه رو در خط فرمان Qt کامپایل میکردم و بعد بازهم از طریق همون محیط خط فرمان میامدم و با زدن دستوری مثل release\prog.exe، برنامم رو اجرا میکردم. مشکل این بود که خط فرمان Qt میاد و متغییر Path سفارشی خودش رو set میکنه:

PATH=d:\Qt\qt\bin;d:\Qt\bin;d:\Qt\mingw\bin;C:\win dows\System32
با پیام خطایی که یک بار دریافت کردم متوجه شدم که برنامهء tasklist.exe به یک فایل dll بنام framedyn.dll نیاز داره که در سیستم من در دایرکتوری C:\WINDOWS\system32\wbem قرار داشت که همونطور که مشاهده میکنید این دایرکتوری در PATH ای که Qt ست میکنه نیست.

بعدم من با این روش بالاخره تونستم وضعیت اسکرین سیور رو در برنامه بفهمم:

QString command="tasklist /fi \"SESSIONNAME eq "+sessionName+"\" /fo csv";
if(runAndWaitCommand(command, true).contains(".scr\",\"")) {
...
}

توضیح اینکه runAndWaitCommand متدی هست که فرمان رو اجرا کرده و خروجی اون رو برمیگردونه.

اما روش استفاده از SystemParametersInfo که شما گذاشتید به گمانم خیلی بهتر باشه، به همین خاطر به این روش سویچ کردم.
راستی من در برنامه Qt خودم windows.h رو اینکلود کردم تا این تابع در دسترس قرار گرفت. ولی آرگومان SPI_GETSCREENSAVERRUNNING با اینکه winuser.h رو هم اینکلود کردم تعریف نشد که البته بجاش از مقدار عددیش (114) استفاده کردم.
ضمنا این windows.h و winuser.h به گمانم مال خود MinGW هستن.