【【【【 请问怎么使用 CEvent 系统对象?谢谢 】】】】
我想当键盘钩子过程截获组合键后我的主程序就开始执行一个模块,在钩子里使用PulseEvent(),在主程序里waitforsingleobject(),比如
在钩子中
if(按键==组合键)
PulseEvent();
主程序中
waitforsingleobject();
do something
查了msdn,无奈英文太烂,看不大懂,请问具体怎么使用?请指教,谢谢
问题点数:50、回复次数:9Top
1 楼lj9852(Loading)回复于 2002-05-17 17:05:50 得分 0
vc版没人理,到c++版来碰碰运气Top
2 楼kary(BCBuider回复)回复于 2002-05-17 17:10:15 得分 20
申明一个全局或类对象中的CEvent e;
A线程
WaitForSingleObject(e,INFINITE);
B线程:
if(按键==组合键)
e.PulseEvent();Top
3 楼lj9852(Loading)回复于 2002-05-17 17:16:20 得分 0
CEvent在哪里声明?我的键盘钩子是做在dll里的,需要共享区吗Top
4 楼heartliubin(bin)回复于 2002-05-17 17:34:35 得分 5
我想你最好做一个内存映像文件,来传递这个CEvent事件.Top
5 楼lj9852(Loading)回复于 2002-05-17 19:18:10 得分 0
又回到vc来转转……Top
6 楼iamshuke()回复于 2002-05-17 19:27:02 得分 25
用命名对象吧,在不同进程间也可以实现同步。
HANDLE h=CreateEvent(NULL,TRUE,FALSE,"HY-gsk-3AC01994-FD16-4F4F-9BA7-20020123CC76");
dwRet=GetLastError();
if(dwRet==ERROR_ALREADY_EXISTS)//该命名对象已存在
{
if(WaitForSingleObject(h,0)==WAIT_TIMEOUT)//处于ResetEvent()状态
{
}
}
可以用SetEvent(h)和ResetEvent(h)来作标记。Top
7 楼duhualin(白桦林)回复于 2002-05-17 22:01:42 得分 0
可靠棵Top
8 楼lj9852(Loading)回复于 2002-05-18 00:43:57 得分 0
解决了,谢谢Top
9 楼iamshuke()回复于 2002-05-19 19:43:07 得分 0
使用CreateEvent,你可以创建一个命名对象,该命名对象在系统中是唯一的。 例如我在进程A中创建了一个命名对象"MyEvent200205201918",那么在进程B中创建同一名称的命名对象时,GetLastError()会返回ERROR_ALREADY_EXISTS,意思是该命名对象己经存在。这返回的句柄将指向你在进程A中的命名对象。也就是说进程A和进程B中的两个HANDLE指向了同一个对象。你可以用这两个句柄中的任一个改变(或获得)命名对象的状态。
例1,我要在进程A中启动进程B,然后进程A等待进程B完成某项工作后才继续。
进程A:
HANDLE h=CreateEvent(NULL,TRUE,FALSE,"HY-gsk-3AC01994-FD16-4F4F-9BA7-20020123CC76");
启动进程B;
if(WaitForSingleObject(h,600000)==WAIT_TIMEOUT)//等待进程B触发该Event,1分钟后若进程B没有动作就超时。
{
//进程B没有完成工作
}
进程B:
....
完成某项工作
....
HANDLE h=CreateEvent(NULL,TRUE,FALSE,"HY-gsk-3AC01994-FD16-4F4F-9BA7-20020123CC76");
SetEvent(h);//进程A将继续
例2:保证某一时刻只运行应用程序的一个实例。
BOOL CMyApp::InitInstance()
{
//创建一命名内核对象,如果该对象已存在,说明本程序已运行了一个实例,退出。BOOL CAaaaaaApp::InitInstance()
{
AfxEnableControlContainer();
HANDLE h=CreateEvent(NULL,TRUE,FALSE,"Example-3AC01994-FD16-4F4F-9BA7-A5F27AE8CC76");
DWORD dwRet=GetLastError();
if(dwRet==ERROR_ALREADY_EXISTS)
{
return FALSE;
}
....
}Top




