هل هناك وظيفة مثل peekmessage التي لا تعالج الرسائل؟

StackOverflow https://stackoverflow.com/questions/1133507

سؤال

أحاول الاتصال ببراءة

PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD);

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

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

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

هل هناك بعض العلم يمكنني إضافته إلى مكالمة بيكميساج؟ لم أر شيئا جديدا في الوثائق على MSDN. أنا حقا بحاجة إلى PeekMessage هذا لا يعالج الرسائل. مساعدة!

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

المحلول

ربما أنا أفتقد واضح، ولكن المواصة هي فيلبوس جميلة الذي - التي سوف تفعل ذلك:

وظيفة peekmessage. إفرازات واردة الرسائل المرسلة، والتحقق من قائمة انتظار رسائل مؤشر الترابط للحصول على رسالة مرسلة، وتسترجع الرسالة (إن وجدت).

...

خلال هذه الدعوة، يسلم النظام رسائل معلقة وغير خاصة, ، أي أن الرسائل المرسلة إلى Windows مملوكة من خلال مؤشر ترابط الاتصال باستخدام SendMessage أو SendMessageCallback أو SendMessageTimeout أو وظيفة sendnotifymessage. ثم يتم استرجاع أول رسالة في قائمة الانتظار التي تطابق المرشح المحدد. قد يقوم النظام أيضا بمعالجة الأحداث الداخلية. وبعد إذا لم يتم تحديد أي عامل تصفية، تتم معالجة الرسائل بالترتيب التالي:

  • الرسائل المرسلة
  • نشر الرسائل
  • رسائل الإدخال (الأجهزة) والأحداث الداخلية للنظام
  • الرسائل المرسلة (مرة أخرى)
  • WM_PAINT. رسائل
  • رسائل WM_TIMER.

لاسترداد رسائل الإدخال قبل نشر الرسائل، استخدم معلمات WMSGFiltermin و WMSGFILTERMAX.

نصائح أخرى

أعتقد أن هذا هو ما يفترض أن يفعله بيكميستاج. الفرق الوحيد بينه و getmessage. هي أن كتل GetMessage حتى تصل رسالة، حيث سيتم إرجاع peekmessage صحيحا أو خطأ اعتمادا على ما إذا كانت رسالة مطابقة تم العثور على المرشح. ستظل معالجة الرسائل إذا تم العثور عليها.

GetQueUestatus هو أسرع طريقة للتحقق مما إذا كانت هناك رسائل متوفرة. سوف تحقق فقط من بعض الأعلام وتستغرق معلمة واحدة فقط مقارنة ب 5 معلمات من peekmessage. سيعطي تلميح سريع إذا كانت هناك رسائل متاحة، فلن تتمكن من معالجة الرسالة بأي طريقة.

getqueuestatus و getinputstatus هي الوظائف ذات الصلة.

بيكميساج يعالج الرسائل لأن هذا ما يفعله بيكميستاج.

ربما يتم تسميته بشكل سيئ، ولكن لا تزيل peekmessage الرسالة من قائمة الانتظار إذا كان هناك أي متاح.

Just modified the PM_REMOVE flag for the PM_NOREMOVE





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PROJECT_NAME
{
    class cUtil
    {
        //===============================
        cUtil()
        {
        }
        //================================
        ~cUtil()
        {
        }
        //=================================
        public struct Message
        {
            public IntPtr handle;
            public uint msg;
            public IntPtr wParam;
            public IntPtr lParam;
            public uint time;
            public System.Drawing.Point p;
        }

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool PeekMessage(out Message lpMsg, Int32 hwnd, Int32 wMsgFilterMin, Int32 wMsgFilterMax, uint wRemoveMsg);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool TranslateMessage(out Message lpMsg); //(ref Message lpMsg);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern Int32 DispatchMessage(out Message lpMsg); //(ref Message lpMsg);

        //private static uint PM_NOREMOVE = 0x0000;
        private static uint PM_REMOVE = 0x0001;
        //private static uint PM_NOYIELD = 0x0002;
        public static void Peek()
        {
            Message winMsg;
            while (PeekMessage(out winMsg, (Int32)0, (Int32)0, (Int32)0, PM_REMOVE))
            {
                TranslateMessage(out winMsg);
                DispatchMessage(out winMsg);
            }

        }
    }
}


//================================
//================================
//===============================

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PROJECT_NAME
{
    public partial class foNAME : Form
    {
        //===================================
        public foRAMQ()
        {
            InitializeComponent();
        }
        //===================================
        private void Job()
        {
            int cnt = 0;

            while( reading_DBMS() )
            {
                cUtil.Peek();

                .
                .
                .
                .
                .
                cnt++;
                lable_count.Text = string.Format("Count: {0}", cnt )            
            }
    }


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