PeekMessage TranslateMessage DispatchMessage。有没有办法在没有EXTERN的情况下在.NET中本地执行此操作?

时间:2018-05-31 13:43:21

标签: c# .net dicom

我正在努力升级使用这种mecahnism进行DICOM服务的旧项目。我正在使用leadtools。它们是示例代码https://www.leadtools.com/help/leadtools/v19/dh/di/dicomassociate.html

似乎要求扩展到User32.DLL,我试图弄清楚是否有更好的方法在.NET中实现这一点?

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您的代码在服务中运行,请避免使用Application.DoEvents(),因为除其他原因外,它还需要添加System.Windows.Forms引用。

关于建议WaitHandle.WaitOne()的评论,我认为它不会起作用,因为它不会清除Windows消息管道。

需要3个函数PeekMessage,TranslateMessage和DispatchMessage,因为我们的SDK的DicomNet使用Windows消息,因此您必须抽取消息队列以查找与Windows消息混合的DICOM消息。 WaitHandle不会对Windows消息队列做任何事情。

使用这三个函数与所有Windows应用程序中存在的消息泵相同,无论多年来添加到哪些新技术层(如.NET框架)。它是最低级别的版本,因此最轻量级。

如果有什么我会改变,那就是使用GetMessage而不是PeakMessage作为消息泵。这可能会提高性能并降低CPU利用率。有一个演示项目使用这种方法in this forum post。帖子很旧,但消息泵的概念仍然相同。

注意:如果您使用的是LEADTOOLS的当前版本20,则添加了新的DicomNet.Breathe method,这样您就不必使用extern了。该方法只是实现了标准的Windows消息泵。