在 C# 中异步接收 class 库中的 Windows 消息
Receiving Windows Message in class library asynchronously in C#
正在编写一个 class 库,其中函数 return 基于使用 window 句柄收到的 window 消息的字符串值。
目前,无法异步等待接收 window 消息。
下面是正在使用的伪代码。
namespace TestIntialization
{
public class Example : Form
{
string status = "";
public string init()
{
Example ex = new Example();
ex.intialise(this.Handle); // this handle used for receiving window message
// Need to wait for wndProc handler to update string value.
return status;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x2000)
{
status = "SUCESS";
}
if (m.Msg == 0x2001)
{
status = "FAILURE";
}
base.WndProc(ref m);
}
}
}
尝试了 Thread.sleep、EventWaitHandle 的 WaitOne 函数之类的选项,但此函数阻塞了 运行 线程。
我在 WndProc 处理程序中收到预期的 window 消息,但值仅在退出 init 函数后才到达消息处理程序。
因此无法通知调用应用程序有关成功或失败状态。
我们可以通过调用Application.DoEvents()
实现同步事件处理
但是在使用 Application.DoEvents() 函数时会产生一些不良后果。我使用此表单仅用于接收 window 消息,最终用户看不到该表单。所以我现在没有遇到任何问题。
while(!flag) // flag value will be set true after processing wnd proc message.
{
Application.DoEvents();
}
正在编写一个 class 库,其中函数 return 基于使用 window 句柄收到的 window 消息的字符串值。
目前,无法异步等待接收 window 消息。 下面是正在使用的伪代码。
namespace TestIntialization
{
public class Example : Form
{
string status = "";
public string init()
{
Example ex = new Example();
ex.intialise(this.Handle); // this handle used for receiving window message
// Need to wait for wndProc handler to update string value.
return status;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x2000)
{
status = "SUCESS";
}
if (m.Msg == 0x2001)
{
status = "FAILURE";
}
base.WndProc(ref m);
}
}
}
尝试了 Thread.sleep、EventWaitHandle 的 WaitOne 函数之类的选项,但此函数阻塞了 运行 线程。 我在 WndProc 处理程序中收到预期的 window 消息,但值仅在退出 init 函数后才到达消息处理程序。 因此无法通知调用应用程序有关成功或失败状态。
我们可以通过调用Application.DoEvents()
实现同步事件处理但是在使用 Application.DoEvents() 函数时会产生一些不良后果。我使用此表单仅用于接收 window 消息,最终用户看不到该表单。所以我现在没有遇到任何问题。
while(!flag) // flag value will be set true after processing wnd proc message.
{
Application.DoEvents();
}