문제

아무렇지도 않게 전화를 하려고 하는데

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

PeekMessage 호출에서 Windows Vista 64는 메시지 처리 중.결과적으로 나는 페인트 호출과 모든 종류의 다른 코드에 대해 재진입하게 됩니다.

우리 애플리케이션에서는 페인팅에 몇 초가 걸릴 수 있으므로 사용자가 키를 눌렀는지 확인하기 위해 PeekMessage 호출을 추가하여 해당 페인팅을 중단하고 다음 작업을 시작할 수 있었습니다.우리는 Windows가 우리에 대한 메시지 처리를 시작할 수 있다는 사실을 거의 깨닫지 못했습니다.실제 페인팅 작업을 별도의 스레드에 넣는 것은 대규모 리팩토링이 될 것입니다...렌더링을 중단하기 위해 특정 키가 눌렸는지, 마우스 휠이 회전했는지 또는 마우스 버튼이 클릭되었는지 확인하려고 합니다.

재진입을 방지하기 위해 특별히 코드를 추가한 다음 페인트 메시지를 대기열 등에 다시 삽입해 보았습니다.다 너무 복잡하고, 잘 안 되는 경우도 있어요.

PeekMessage 호출에 추가할 수 있는 플래그가 있나요?MSDN 문서에서 새로운 내용을 보지 못했습니다.정말 필요해요 PeekMessage 메시지를 처리하지 않습니다.돕다!

도움이 되었습니까?

해결책

어쩌면 내가 분명한 것을 놓치고 있는 것일 수도 있지만, 사양이 꽤 장황하네요 저것 그렇게 될 것이다:

PeekMessage 기능 들어오는 파견 보낸 메시지, 확인 게시된 스레드 메시지 큐 message를 검색하고, 메시지를 검색합니다( any exist)를 사용합니다.

...

이 통화 중에, 이 시스템은 보류중인 무수한 메시지를 전달합니다, 말하자면 가 소유한 Windows로 전송된 메시지 SendMessage를 사용하여 스레드를 호출합니다. SendMessageCallback, SendMessageTimeout 또는 SendNotifyMessage 함수를 사용합니다.그런 다음 일치하는 첫 번째 대기 중인 메시지 지정된 필터가 검색됩니다. 시스템은 또한 내부 이벤트를 처리 할 수 ​​있습니다.필터를 지정하지 않으면 메시지는 다음 순서:

  • 보낸 메시지
  • 게시된 메시지
  • 입력(하드웨어) 메시지 및 시스템 내부 이벤트
  • 보낸 메시지(다시)
  • WM_PAINT 메시지
  • WM_TIMER 메시지

이전 입력 메시지를 검색하려면 게시된 메시지, wMsgFilterMin 사용 및 wMsgFilterMax 매개 변수.

다른 팁

나는 이것이 Peekmessage가해야 할 일이라고 생각합니다. 그것과 그 사이의 유일한 차이점 getMessage 그 getMessage는 메시지가 도착할 때까지 블록이 발생합니다. 여기서 PeekMessage는 필터와 일치하는 메시지가 발견되었는지 여부에 따라 true 또는 false를 반환합니다. 메시지가 발견되면 여전히 처리됩니다.

GetqueUestatus는 사용 가능한 메시지가 있는지 확인하는 가장 빠른 방법입니다. PeekMessage의 5 개의 매개 변수에 비해 몇 개의 플래그 만 확인하고 1 개의 매개 변수 만 가져갑니다. 사용 가능한 메시지가 있으면 빠른 힌트를 줄 것입니다. 어떤 식 으로든 메시지를 처리하지 않습니다.

getqueuestatus와 getInputStatus는 관련 기능입니다.

PeekMessage 메시지는 PeekMessage가하는 일이기 때문에 메시지를 처리합니다.

어쩌면 이름이 잘못되었지만 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