使用C#创建Win32事件

13

我想从C#中创建一个内核(也称为命名事件)。

我是否需要与Interop服务打交道并封装本地CreateEvent函数,还是已经有一个.NET类来完成这项工作?

我需要运行的函数应该像这样: hEvent = CreateEvent(NULL, false, false, "MyCSHARPEvent");

这应该会通知所有探测"MyCSHARPEvent"事件的进程。

如果需要封装函数,我将如何将SECURITY_ATTRIBUTES结构体从C#翻译成win32?

2个回答

21

看一下EventWaitHandle类。它从.NET 2.0开始得到支持,允许创建命名事件。根据您使用的构造函数,它还支持设置事件安全性。


7
如果您仍想使用Interop,可以像这样定义函数:
[DllImport("kernel32.dll")]
static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);

这是结构体的样式(您可能需要调整Pack属性以使其适合):
[StructLayout(LayoutKind.Sequential)]
struct SECURITY_ATTRIBUTES{
  public int length;
  public IntPtr securityDesc;
  public bool inherit;
}

此外,这里是一个把所有内容结合起来的代码示例。点击链接查看。

哇 - 我以为只有 CF 才这么糟糕(它仍然不支持命名的 EventWaitHandles)。 - ctacke
CF 3.5 现在支持 EventWaitHandles。 - Sam
为什么很多人认为PInvoke是解决.NET所有问题的方法? - Dan
@Dan 你知道你正在回复一篇超过4年的老答案吗? - scottm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接