WEB开发网
开发学院软件开发Java 集成 Windows 本地应用到 Eclipse RCP 程序中 阅读

集成 Windows 本地应用到 Eclipse RCP 程序中

 2009-12-18 00:00:00 来源:WEB开发网   
核心提示: 以下是创建事件的代码,我们创建了一个名为 Global\WaitWindowCreatedEvent 的事件:SECURITY_ATTRIBUTESsecuAtt;secuAtt.bInheritHandle=TRUE;secuAtt.lpSecurityDescriptor=NULL;secu

以下是创建事件的代码,我们创建了一个名为 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); 
} 

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:集成 Windows 本地

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接