Skip to content

WindowsApi:PeekMessage

Clear message queue

Mobile Application 개발하는데 특정 이벤트가 발생하고 종료할 때까지 3초정도의 시간이 걸리는데 이 시간동안에 다른 이벤트가 발생하지 못하게 막아야 할 경우가 생겼습니다. 제일 처음에 취한 조치는 Form.Enable = false로 해주고 3초가 지나면 true로 해주었습니다. 이 경우에는 3초가 지나고 나서 이벤트가 발생하였습니다. 그래서 Message Queue의 모든 Message를 제거해주는 방법을 찾아보았습니다.

그래서 제일 먼저 떠오른 생각은 메시지 관련 인터페이스인 IMessageFilter를 먼저 떠올렸는데 Compact Framework에서는 이 인터페이스가 제공되지 않습니다. 직접 IMessageFilter를 구현해서 Message를 받아오는 코드를 찾았지만 해당 코드에는 매개변수로 Control를 넘겨줘야 했습니다. 그런데 아쉽게도(?) 이 코드(Control를 매개변수로 받는)는 제가 개발하고 있는 Application에서 사용할 수 없었습니다. 그래서 다시 검색을 하여 아래의 방법을 찾았습니다.

struct MSG
{
    IntPtr hwnd;
    uint message;
    IntPtr wParam;
    IntPtr lParam;
    int time;
    int ptX;
    int ptY;
}

[DllImport("coredll")]
extern static bool PeekMessage(out MSG Msg, uint hWnd, uint
wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);

const uint PM_REMOVE = 1;

public static void ClearMessages()
{
    MSG msg;
    while (PeekMessage(out msg, 0, 0, 0, PM_REMOVE)) ;
}

여기서 Compact Framework에서는 Message의 구조가 정의되어 있지 않아서 직접 MSG라는 struct를 만들어준 것을 볼 수 있으며 PM_REMOVE(1)는 Message Queue에 있는 모든 메세지를 하나의 메세지를 삭제하는 파라미터인 것을 알 수 있습니다.