سؤال

لدي c# التطبيق الذي يعمل على أنه خدمة windows السيطرة على اتصالات مأخذ التوصيل وغيرها من الأمور.أيضا هناك تطبيق نماذج windows للسيطرة على تكوين هذه الخدمة (systray مع بدء أو إيقاف عرض النموذج مع معلمات التكوين).

أنا باستخدام .صافي الاتصال عن بعد للقيام IPC و أنه على ما يرام, ولكن الآن أريد أن تظهر بعض حركة المرور وغيرها من التقارير والاتصال عن بعد لن لمقابلة متطلبات الأداء.لذلك أريد أن الجمع بين كل من التطبيقات في واحد.

وهنا تكمن المشكلة:

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

حتى, كيفية حل ذلك ؟ كيف هي أفضل طريقة لجعل ويندوز الخدمة مع systray التحكم في نفس العملية متاحة لأي مستخدم تسجيل الدخول ؟

تحديث:شكرا على التعليقات حتى الآن يا رفاق.أنا أتفق فمن الأفضل استخدام التصنيف الدولي للبراءات وأنا أعلم أنه سيء إلى مزيج ويندوز الخدمات واجهات المستخدم.حتى على الرغم من أنني أريد أن أعرف كيف أفعل ذلك.

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

المحلول

عمليتين منفصلتين التواصل باستخدام التكنولوجيا الخاصة بك في الاختيار.الخدمات مع واجهة المستخدم هو فكرة سيئة.لا تذهب في هذا الطريق - سوف تندم على ذلك.

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

نصائح أخرى

في الواقع يجب أن لا زوجين الخدمة الخاص بك مع واجهة المستخدم.

أنا أتفق مع جريج.ربما يمكنك أن تدرس مختلف IPC آلية.ربما استخدام المقابس والمفاتيح الخاصة بك البروتوكول.أو إذا كان لديك خدمة مراقبة التطبيق يمكنك فقط التحكم في الخدمة على الجهاز المحلي ، يمكنك استخدام أنابيب الاتصال المسماة (أسرع).

هنا هو طريقة خلط الخدمات وأشكال

http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx

عرفت كيف تفعل هذا من هذه المادة (انقر على "تغيير" الموجود في أساليب الجدول).

string wmiPath = "Win32_Service.Name='" + SERVICE_NAME + "'";
using (ManagementObject service = new ManagementObject(wmiPath))
{
    object[] parameters = new object[11];
    parameters[5] = true;  // Enable desktop interaction
    service.InvokeMethod("Change", parameters);
}

لدي الحل في خطوات قليلة, هذه هي الخطة

  1. نحن لن لإنشاء مشروع نموذج windows, بدلا من ذلك نحن نذهب إلى إنشاء visual studio الحل الذي يحتوي على windows خدمة المشروع نموذج windows المشروع إعداد المشروع.

  2. الفكرة هي أن يكون لديك قاعدة بيانات أو ملف أو أي شيء كنت مرتاحا مع تخزين البيانات التي سوف تخزن المعلمات الخاص بك ويندوز الخدمة دائما استخدام لتشغيل.إذا ويندوز الخاص بك خدمة ويندوز الخاص بك شكل التطبيق يجب أن تكون قادرا على تعديل و استرجاع البيانات منه.

  3. إلى النموذج الرئيسي من تطبيق Windows قم بسحب وإسقاط NotifyIcon على شكل في علامة التبويب خصائص تصفح وحدد أحد .ico الصورة(يمكنك sreate واحد في visual studio ولكن هذا موضوع آخر يمكنك الحصول على جوجل أو الاتصال بي) أنه سيتم عرض في علبة النظام عند تشغيل تطبيق النموذج الرئيسي نشطة أو عرض ، حاول تشغيل التطبيق.

  4. إضافة كلاهما النواتج في إعداد مشروع الحل.إضافة المشروع إلى إعداد مشروع يجب أن تكون في نفس الحل.حق انقر فوق إعداد المشروع في "مستكشف الحلول" تسليط الضوء على add ثم اختر إخراج المشروع ، إضافة خدمة windows و windows شكل المخرجات سوف تراهم في "مستكشف الحلول" تحت الإعداد المشروع.

  5. إضافة خدمة windows يذهب إلى أبعد من هذا ولكن هذا هو أيضا موضوع آخر جوجل انها

  6. إنشاء اختصار لتطبيق ويندوز وإضافته إلى مجلد بدء التشغيل هو أيضا موضوع آخر google أو الاتصال بي.

    ملاحظة البرنامج النموذج الخاص بك في مثل هذه الطريقة التي الزر "إغلاق" لا تظهر و شكل يذهب بي.visible = false و الضغط مرتين على رمز في علبة النظام هو السبيل الوحيد لضبط لي.visible=true.بهذه الطريقة في أي وقت من جهاز الكمبيوتر الخاص بي, ويندوز الخاص بك شكل التطبيق هو أيضا بدأت مرئية على الفور تعيين إلى false ولكن نظرا لأنه لديه notifyicon مع رمز الصورة وسوف تظهر في علبة النظام و النقر المزدوج يجعل شكل مرئية تحرير الإعدادات التي يتم تخزينها على خدمة أيضا يبدأ تلقائيا منذ أن كنت قد وضعت ذلك في إعداد الخدمة في إعداد المشروع.بريدي هو iamjavademon@gmail.com أفضل التوضيح باستخدام لقطات الشاشة و شرح كامل

هو ببساطة شديدة - الحاجة إلى إنشاء مؤشر ترابط واحد لأداء أحداث التطبيق.مثل هذا( التعليمات البرمجية المصدر C++ مع CLR, ولكن يمكن أن تجعل هذا في C#):

ref class RunWindow{
public:
    static void MakeWindow(Object^ data)
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        Application::Run(gcnew TMainForm());
    };
};

وخلق الموضوع في الرئيسية

int main(array<System::String ^> ^args)
{
    bool bService = RunAsService(L"SimpleServiceWithIconInTrayAndWindow");

    if (bService)
    {

        System::Threading::Thread ^thread = gcnew System::Threading::Thread(gcnew ParameterizedThreadStart(RunWindow::MakeWindow));
        thread->Start();

        ServiceBase::Run(gcnew simpleWinService());
        Application::Exit();
    }
    else
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // Create the main window and run it
        Application::Run(gcnew TMainForm());
    }

    return 0;
}

المشاكل الرئيسية مع الخدمات التفاعلية هي:

  • الأمن - عملية أخرى يمكن أن ترسل رسائل من خلال رسالة مضخة ، وبالتالي الوصول إلى نظام/المحلية عملية.

  • والنقص - خدمة تفاعلية لا يرى قذيفة رسائل, وبالتالي لا يمكن أن تتفاعل مع رموز منطقة الإعلام.

نحن بانتظام استخدام اتصالات TCP و UDP تمرير معلومات من الخدمات الأخرى السابقين, و, في بعض الحالات ، MSMQ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top