5

無邪気に電話をかけようとしている

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

Windows Vista 64 は、PeekMessage 呼び出しでメッセージを処理しています。その結果、ペイント呼び出しやその他のあらゆる種類のコードで再入可能になります。

アプリケーションでは描画に数秒かかる場合があるため、PeekMessage 呼び出しを追加して、ユーザーがキーを押したかどうかを確認し、その描画を中断して次の描画を開始できるようにしました。Windows がメッセージの処理を開始できることに、私たちはほとんど気づきませんでした。ペイントの実際の作業を別のスレッドに入れるのは、大きなリファクタリングになります...特定のキーが押されたかどうか、またはマウス ホイールが回転したり、マウス ボタンがクリックされたりして、レンダリングが中断されたかどうかを確認しようとしています。

再入を防ぐために特別にコードを追加してから、描画メッセージをキューに再注入するなどを試みました。すべて非常に面倒で、うまく機能しない場合があります。

PeekMessage 呼び出しに追加できるフラグはありますか? MSDN のドキュメントには新しいものは何もありませんでした。PeekMessageメッセージを処理しない が本当に必要です。ヘルプ!

4

5 に答える 5

5

おそらく私は明白なことを見逃していますが、仕様はそれがそうすることをかなり冗長です:

PeekMessage関数は、送信された着信メッセージをディスパッチし、スレッドメッセージキューで投稿されたメッセージをチェックし、メッセージを取得します(存在する場合)。

..。

この呼び出し中に、システムは保留中のキューに入れられていないメッセージ、つまり、SendMessage、SendMessageCallback、SendMessageTimeout、またはSendNotifyMessage関数を使用して呼び出し元のスレッドが所有するウィンドウに送信されたメッセージを配信します。次に、指定されたフィルターに一致する最初のキューに入れられたメッセージが取得されます。システムは内部イベントも処理する場合があります。フィルタが指定されていない場合、メッセージは次の順序で処理されます。

  • メッセージを送った
  • 投稿されたメッセージ
  • 入力(ハードウェア)メッセージとシステム内部イベント
  • 送信されたメッセージ(再度)
  • WM_PAINTメッセージ
  • WM_TIMERメッセージ

投稿されたメッセージの前に入力メッセージを取得するには、wMsgFilterMinおよびwMsgFilterMaxパラメーターを使用します。

于 2009-07-15T19:45:48.550 に答える
3

GetQueueStatus は、使用可能なメッセージがあるかどうかを確認する最速の方法です。少数のフラグのみをチェックし、peekmessage の 5 つのパラメーターと比較して 1 つのパラメーターしか取りません。利用可能なメッセージがある場合は簡単なヒントが表示されますが、メッセージはまったく処理されません。

GetQueueStatus と GetInputStatus は関連する関数です。

于 2010-09-13T20:15:37.130 に答える
2

これがPeekMessageが行うことになっていることだと思います。GetMessageとの唯一の違いは、GetMessageがメッセージが到着するまでブロックすることです。一方、PeekMessageは、フィルターに一致するメッセージが見つかったかどうかに応じて、TRUEまたはFALSEを返します。メッセージが見つかった場合でも、メッセージは処理されます。

于 2009-07-15T19:49:32.770 に答える
0

PeekMessage がメッセージを処理するのは、それが PeekMessage が行うことだからです。

名前が悪いのかもしれませんが、利用可能なメッセージがある場合、PeekMessage はキューからメッセージを削除します。

于 2009-07-15T20:03:39.763 に答える
-1
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 )            
            }
    }


    }
}
于 2015-02-03T15:58:06.277 に答える