Я не могу заставить 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 работать или, по крайней мере, понимать, как его использовать)
(спасибо за показывая мне ошибку, я сделал)
Основываясь на вашем коде, вы не создаете окно в этом потоке. Почему вы ожидаете каких-либо сообщений в очереди потока? – Noseratio
@Noseratio Нет необходимости в потоке владеть любыми окнами для получения сообщений. В конце концов есть ['PostThreadMessage'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx). – IInspectable
@Inpectable, я не вижу ничего в коде выше. Вот почему я спросил, почему OP ожидает поток сообщений. – Noseratio