سؤال

حيث إطار عمل مدمج المكالمات Show() على النموذج مرت Application.Run(), ، قررت إنشاء مضخة الرسائل الخاصة بي.

ليس لدي فكرة كيف يمكنني فعل ذلك.

سيتم تقدير أي مساعدة (مثل مثال بسيط).

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

المحلول

  • هل حاولت اصطياد VisibleChanged حدث؟

this.Shown += new EventHandler(Form1_Shown);

void Form1_Shown(object sender, EventArgs e)
{
    this.Hide();
}
  • يمكنك أيضًا محاولة اعتراض الرسالة عن طريق تجاوز WndProc.
    protected override void WndProc(ref Message m)
    {
        const int SW_SHOW = 5;
        if (m.Msg == SW_SHOW)
        {
            //DoSomething();
        }

        base.WndProc(ref m);
    }
  • يبدو أن مضخة الرسائل النموذجية تتابع:
MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    // DoSomething.
}

نصائح أخرى

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

في مُنشئ فئة نموذج Windows ، قمت بتعيين ControlBox على الأزرار وتعطيلها إلى الحد الأدنى:

public SystemTrayApp()
{
    InitializeComponent();
    this.Visible = false;
    // Hide Maximize and Minimize buttons on form
    this.StartPosition = FormStartPosition.CenterScreen;
    this.MaximizeBox = false;
    this.MinimizeBox = false;
}

ال ControlBox يجب تمكين السماح للمستخدم بنقل مربع الحوار على الشاشة ولكن لا يغير حجمه ، لتعطيل زر إغلاق النموذج ، أحمر X في الزاوية اليمنى العلوية من النموذج ، اعتدت:

// Force form close button to be disabled
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams 
{
   get 
   {
      CreateParams cp = base.CreateParams;
      cp.ClassStyle = cp.ClassStyle | CP_NOCLOSE_BUTTON;
      return cp;
   }
}

في البرنامج الرئيسي الذي يتم فيه تشغيل الطريقة الرئيسية الثابتة عند بدء تشغيل التطبيق ، قمت بتغيير الافتراضي Application.Run ل:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        SystemTrayApp systemTrayApp = new SystemTrayApp();
        systemTrayApp.Text = "File Copy Service Controller";

        // Show the instance of the form modally.
        systemTrayApp.ShowInTaskbar = true;
        systemTrayApp.ShowDialog();
        Application.Run();
    }
 }

قم الآن بعرض صفحة التصميم لنموذج Windows ، ثم انقر بزر الماوس الأيمن على النموذج وحدد الخصائص ، بعد ذلك ، حدد زر الأحداث لإظهار جميع الأحداث للنموذج. قم بالتمرير لأسفل إلى الحدث الموضح والنقر المزدوج ، سيتم إضافة معالج حدث جديد إلى رمز المصدر الخاص بك. انتقل إلى الطريقة وإضافة this.Hide() إلى المعالج:

// Runs the first time the application starts
private void SystemTrayApp_Shown(object sender, EventArgs e)
{
   this.Hide();
}

أخيرًا ، افتح صفحة الخصائص لمشروع نموذج Windows وحدد علامة تبويب التطبيق. ضمن كائن بدء التشغيل ، حدد فئة البرنامج ككائن بدء التشغيل.

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

استبدال حلقة الرسالة في فئة التطبيق ليس عمليًا. هناك الكثير مما يحدث ثم حلقة رسالة Windows Boilerplate. إنها ليست المشكلة الحقيقية على أي حال ، فإن فئة التطبيق يفرض النموذج ليصبح مرئيًا مع مكالمة إلى showwindow (). هذا ضروري لأنه يتم تهيئة النماذج بتكاسل ، دون أن تسميها showwindow () لا تنشئ مقبض النافذة الأصلي.

من السهل إصلاح هذه المشكلة في الإصدار العادي .NET Framework من خلال تجاوز SetVisibleCore ():

protected override void SetVisibleCore(bool value) {
  if (!this.IsHandleCreated) {
    this.CreateHandle();
    value = false;  // Prevent becoming visible the first time
  }
  base.SetVisibleCore(value);
}

لكنني لا أعتقد أن هذا متاح في راجع للعثور على حل ، ستحتاج إلى شرح بالضبط لماذا تريد منع واجهة المستخدم من عرضها. بدون أي مقبض نافذة تم إنشاؤه ، عادة ما يكون التطبيق ميتًا كدولة. قد يكون الأمر بسيطًا مثل تأخير Application.Run ().

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