C# 查看.NET进程中本机进程创建的全局事件 < >我在一个原生C++进程中创建并设置了一个全局事件,它是这样创建的: HANDLE hGlobalEvent = CreateEvent(NULL, TRUE, FALSE, _T("Global\\MyEvent"));
是否有任何方法(即使不是MS编写的库)在.NET(C#)进程中注册这些事件之一,以便在全局事件更改时触发标准.NET事件处理程序?C# 查看.NET进程中本机进程创建的全局事件 < >我在一个原生C++进程中创建并设置了一个全局事件,它是这样创建的: HANDLE hGlobalEvent = CreateEvent(NULL, TRUE, FALSE, _T("Global\\MyEvent"));,c#,.net,c++,winapi,events,C#,.net,C++,Winapi,Events,是否有任何方法(即使不是MS编写的库)在.NET(C#)进程中注册这些事件之一,以便在全局事件更改时触发标准.NET事件处理程序? 而且我并不真的想等待事件和循环,就像C++中的WaitForSingleObject那样……我真的希望它是完全异步的事件处理程序。 我不得不想象有一种简单的方法可以做到这一点……就是找不到它。可以用于在事件发出信号时执行回调。通过使用采用字符串名称的获取命名事件对象的WaitHandle bool createdNew; WaitHandle waitHandle
而且我并不真的想等待事件和循环,就像C++中的WaitForSingleObject那样……我真的希望它是完全异步的事件处理程序。 我不得不想象有一种简单的方法可以做到这一点……就是找不到它。可以用于在事件发出信号时执行回调。通过使用采用字符串名称的获取命名事件对象的WaitHandle
bool createdNew;
WaitHandle waitHandle = new EventWaitHandle(false,
EventResetMode.ManualReset, @"Global\MyEvent", out createdNew);
// createdNew should be 'false' because event already exists
ThreadPool.RegisterWaitForSingleObject(waitHandle, MyCallback, null,
-1, true);
void MyCallback(object state, bool timedOut) { /* ... */ }
EventWaitHandle将打开在Win32进程中创建的事件,而不是创建新事件,对吗?是的,您可以调用的构造函数有一个重载来验证这一点;它有一个'out'bool参数,告诉您事件是已经存在还是由构造函数创建的。在您的情况下,out值应该为false。我已经更新了代码片段来展示这一点。太棒了…谢谢你的更新。这真的很有帮助。现在,也许这个问题的一个解决方案会出现在谷歌上:)好吧……这种方法很有效。问题是,我需要知道事件的实际状态,而这一切所做的就是为RegisterWait中的第三个参数传递什么。另外,如果我将最后一个参数保留为true,它只会触发一次,我必须继续重新注册,但如果我将其设置为false,它只会在事件状态发生更改时无休止地调用回调。。。虽然我还不知道这个状态是什么……在C++中,对事件的等待只返回事件状态被更改为“信号”(true),而不是当它变回未发送信号(false)时返回。因此你天生就知道状态。您还可以使用0超时调用wait,如果它返回wait\u对象,则状态为true,如果WAIF\u timeout,则状态为false。但这段C#代码似乎在状态发生任何变化时都会运行回调。。。。