2013-08-19 82 views
1

我無法使PeekMessage正常工作。其實我希望它用信息氾濫我,但它的返回值是0.WinApi - PeekMessage始終返回False

我使用WinForm,啓動後臺線程偷看消息和使用鼠標窗口。該窗口可以像往常一樣使用,但不會有消息被窺視。我究竟做錯了什麼 ?最後的錯誤一直是0。

[StructLayout(LayoutKind.Sequential)] 
public struct NativeMessage 
{ 
    public IntPtr handle; 
    public uint msg; 
    public IntPtr wParam; 
    public IntPtr lParam; 
    public uint time; 
    public Point p; 
    public override string ToString() 
    { 
     return handle + ", " + msg + ", " + wParam + ", " + lParam + ", " + time + ", " + p; 
    } 
} 

[DllImport("user32.dll")] 
public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr window, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg); 

public Form1() 
{ 
    ThreadPool.QueueUserWorkItem(o => run()); 
} 

private void run() 
{ 
    for (int i = 0; i < 1000000;) 
    { 
     NativeMessage a = new NativeMessage(); 
     int c = PeekMessage(out a, IntPtr.Zero, (uint) 0, (uint) 0, (uint) 0); 
     if (c != 0) 
      trace(" -> " + c); // prints strings 
    } 
} 

解決:

  • 我在主線程調用Show()顯示我的形式
  • 和重定向主線程數
  • (未XY問題,我需要的信息PeekMessage工作或至少了解如何使用它)

(感謝給我看我做了錯誤)

+0

根據您的代碼,您不會在該線程上創建窗口。你爲什麼期望線程隊列中有消息? – Noseratio

+0

@Noseratio不需要線程擁有任何窗口來接收消息。畢竟有['PostThreadMessage'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx)。 – IInspectable

+0

@IInspectable,我沒有看到在上面的代碼中的任何地方。這就是爲什麼我問OP爲什麼期待消息氾濫的原因。 – Noseratio

回答

1

窗口消息隊列是每個線程,除非以某種方式有關(AttachThreadInput,窗口父母關係...)

4

當您通過NULL(即0)對於hWnd參數,PeekMessage函數檢索線程消息以及屬於當前線程的任何窗口的消息。這在the documentation明確調用出:

的hWnd [在,可選]

句柄其消息是要檢索的窗口。該窗口必須屬於當前線程。

如果hWnd爲NULLPeekMessage檢索消息對於屬於當前線程的任何窗口,並且對當前線程的消息隊列,其HWND值爲NULL任何消息(見MSG結構)。因此,如果hwndNULL,則處理窗口消息和線程消息。

既然你調用一個線程池一個新線程功能,還有用它獲取任何消息。該線程不與任何窗口關聯並且沒有消息。

當沒有可用消息時,函數返回FALSE(即0)。

如果您在主UI線程(與窗體關聯的那個線程)上調用PeekMessage,您將看到所有發往窗體窗口的消息。

+0

嗯,我實際上讀過這個線程註釋,但是因爲每個窗口都有它自己的線程,所以我很困惑1個線程可以如參數註釋所示那樣查看其他窗口的消息。我只想通過PeekMessage記錄所有消息,並讓它們由API本身進行翻譯。 – Bitterblue

+0

@mini每個窗口都不*有*自己的線程。事實上,一般情況幾乎恰恰相反:每個窗口都在* single *線程上運行;它被稱爲UI線程。爲了回答你的其他問題,一個線程可以通過傳入感興趣的窗口的句柄來查看其他窗口的消息。 –

+1

PeekMessage不是一個很好的日誌記錄機制,當然不是你如何使用它。有更好的方法去做,但這是一個完全不同的問題。如果你問了,我會回答那個問題。謹防[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –