集成 Windows 本地应用到 Eclipse RCP 程序中
2009-12-18 00:00:00 来源:WEB开发网以下是创建事件的代码,我们创建了一个名为 Global\WaitWindowCreatedEvent 的事件:
SECURITY_ATTRIBUTES secuAtt;
secuAtt.bInheritHandle = TRUE;
secuAtt.lpSecurityDescriptor = NULL;
secuAtt.nLength = sizeof(SECURITY_ATTRIBUTES);
hEvent = CreateEvent(&secuAtt,FALSE,FALSE,TEXT("Global\WaitWindowCreatedEvent"));
等待事件状态变化可以调用以下代码:
WaitForSingleObject(hEvent,1000*60);
为了避免无限的等待下去,我们设置了一个最长的等待时间,为60秒。
下面我们再来看 ShellProc 的处理代码。这个函数中,我们主要是要获取应用程序的主窗口。根据 Windows 系统 WH_SHELL 钩子的定义,钩子的处理函数的第一个参数是事件类型,第二个参数是窗口句柄。我们首先判断窗口的类型是否是 HSHELL_WINDOWCREATED,然后判断对应窗口所属的进程号是否等于我们所启动的应用程序,如果需要还要判断窗口类型。一旦我们找到了应用程序主窗口,我们通过调用 SetEvent 来通知主进程继续执行。
LRESULT CALLBACK ShellProc(int nCode,WPARAM wParam,LPARAM lParam){
if(nCode==HSHELL_WINDOWCREATED && childInstanceId!=0){
HWND hwnd=HWND(wParam);
DWORD pid;
HANDLE childEvent;
char classname[100];
GetWindowThreadProcessId(hwnd,&pid);
if(pid==childInstanceId){
if(wndClassName[0]!=0){
int count = GetClassName(hwnd,classname,100);
classname[count] = 0;
if(strcmp(classname,wndClassName)!=0){
return CallNextHookEx(hHook, nCode,
wParam, lParam);
}
}
hChildWnd = hwnd;
ShowWindow(hChildWnd,SW_HIDE);
childEvent = OpenEvent(EVENT_ALL_ACCESS,
TRUE,TEXT("Global\WaitWindowCreatedEvent"));
if(childEvent!=0){
SetEvent(childEvent);
}
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
更多精彩
赞助商链接