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

PeekMessage TranslateMessage DispatchMessage. Is there a way to do this natively in .NET without EXTERN?

我正在努力升级一个旧项目,该项目将此机制用于 DICOM 服务。我正在使用 leadtools。它们是示例代码 https://www.leadtools.com/help/leadtools/v19/dh/di/dicomassociate.html

似乎需要扩展到 User32.DLL,我想知道在 .NET 中是否有更新更好的方法来完成这个?

有什么想法吗?

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

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

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

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

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

注意:如果您使用的是当前版本 20 的 LEADTOOLS,则添加了新的 DicomNet.Breathe method,因此您不必使用 extern。该方法简单地实现了一个标准的 Windows 消息泵。