سؤال

لدي العديد من التطبيقات التي هي جزء من مجموعة من الأدوات التي من مختلف المطورين في استخدام الاستوديو.هذه التطبيقات هي أساسا سطر الأوامر التطبيقات التي تفتح دوس cmd shell.هذه التطبيقات بدوره بدء تشغيل واجهة المستخدم الرسومية تطبيق مسارات الانتاج و وضع (عبر مآخذ) من هذه تطبيقات سطر الأوامر.

سطر الأوامر تطبيقات يمكن أن تبدأ مع المستخدم هو تسجيل الدخول, عند محطة مقفل (أنهم النار قبالة ملف دفعي على الفور ثم قفل بهم workstaion) ، وعندما يتم تسجيل الخروج (عن طريق مهمة مجدولة).المشاكل التي لدي هي مع الحالتين الأخيرتين.

إذا كان أي من هذه التطبيقات النار قبالة عندما يتم تأمين المستخدم أو تسجيل الخروج, هذه الأوامر سوف تفرخ واجهة المستخدم الرسومية ويندوز الذي يقيس الناتج/حالة.هذا جيد ولكن أقول أن المستخدم لديه تأمين محطة العمل الخاصة بهم -- عندما فتح محطة العمل الخاصة بهم ، واجهة المستخدم الرسومية ليست مرئية.انها تعمل قائمة المهام, لكنه غير مرئية.في المرة التالية هؤلاء المستخدمين تشغيل بعض تطبيقات سطر الأوامر ، واجهة المستخدم الرسومية لا تحصل على إطلاقها (لأنه بالفعل تشغيل) ، ولكن لأنها ليست مرئية على سطح المكتب للمستخدمين لا أرى أي الإخراج.

ما أبحث عنه هو طريقة لمعرفة من سطر الأوامر تطبيقات إذا كانت تعمل من وراء تأمين محطة العمل أو عندما يقوم المستخدم بتسجيل الخروج (من خلال المهام المجدولة) -- في الأساس هم دون تشغيل سطح المكتب مستخدم مرئية.إذا أنا يمكن أن أقول ذلك ، ثم أنا ببساطة لا يمكن أن تبدأ لدينا واجهة المستخدم الرسومية و يمكن أن يمنع الكثير من المشاكل.

هذه التطبيقات التي لا تحتاج إلى اختبار C/C++ تطبيقات ويندوز.

آمل أن يكون هذا معنى له.

هل كانت مفيدة؟

المحلول

لقد وجدت برنامجي الإجابة التي كنت أبحث عنها.عليها أن تفعل مع المحطات.على ما يبدو أي شيء يعمل على سطح المكتب سوف تعمل على محطة مع اسم معين.أي شيء ليس على سطح المكتب (أيوهي عملية بدأت قبل إدارة المهام عند تسجيل الخروج أو على تأمين محطة العمل) سوف تبدأ مع اختلاف في اسم المحطة.رمز المثال:

HWINSTA dHandle = GetProcessWindowStation();
if ( GetUserObjectInformation(dHandle, UOI_NAME, nameBuffer, bufferLen, &lenNeeded) ) {
    if ( stricmp(nameBuffer, "winsta0") ) {
        // when we get here, we are not running on the real desktop
        return false;
   }
}

إذا كنت تحصل داخل 'إذا' بيان ، ثم عملية ليست على سطح المكتب ، ولكن تعمل "في مكان آخر".نظرت إلى namebuffer قيمة عندما لا تكون قيد التشغيل من سطح المكتب و أسماء لا يعني الكثير, ولكنها ليست WinSta0.

رابط مستندات هنا.

نصائح أخرى

كنت قد تكون قادرة على استخدام سنس (نظام إعلام الحدث الخدمات).لم يسبق لي استخدامه نفسي, ولكن أنا متأكد من أنها سوف تفعل ما تريد:يعطيك الإعلام للأحداث مثل تسجيل الدخول, تسجيل الخروج, شاشة التوقف, الخ.

وأنا أعلم أن هذا مبهم جدا ، ولكن نأمل أنها سوف الحصول على انك بدأته.جوجل للبحث سريع تحولت هذه ، من بين أمور أخرى: http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

ولقد استخدمت بنجاح هذا النهج للكشف عن ما إذا كان سطح المكتب مقفل على ويندوز:

bool isDesktopLocked = false;
HDESK inputDesktop = OpenInputDesktop(0, FALSE,
             DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
             DESKTOP_ENUMERATE |  DESKTOP_SWITCHDESKTOP |
             DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |
             DESKTOP_WRITE);

if (NULL == inputDesktop)
{
    isDesktopLocked = true;
}
else
{
    CloseDesktop(inputDesktop);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top