WEB开发网
开发学院软件开发VC MS Active Accessibility 接口技术编程尝试 阅读

MS Active Accessibility 接口技术编程尝试

 2006-07-20 11:39:00 来源:WEB开发网   
核心提示: 好,现在回到上面的例子,MS Active Accessibility 接口技术编程尝试(8),上面例子能够执行的前提条件是能够找到标题为"运行"的窗口,现在可以先检查运行窗口是否存在,虽然比较简单,就先写这么多吧,如果不存在就设置WinEvents 钩子去监视,直到&

好,现在回到上面的例子。上面例子能够执行的前提条件是能够找到标题为"运行"的窗口。现在可以先检查运行窗口是否存在,如果不存在就设置WinEvents 钩子去监视,直到"运行"窗口被创建。看下面代码:

if(NULL == (hWndMainWindow = FindWindow(NULL, szMainTitle)))
{
hEventHook = SetWinEventHook(
  EVENT_MIN,  // eventMin ID
  EVENT_MAX,  // eventMax ID
  NULL,    // always NULL for outprocess hook
  WinCreateNotifyProc,    // call back function
  0,        // idProcess
  0,        // idThread
     // always the same for outproc hook
  WINEVENT_SKIPOWNPROCESS | WINEVENT_OUTOFCONTEXT);
}  

第一、二个参数用来指定监视事件的范围。第四个参数是定义的回调函数。

下面是回调函数:

void CALLBACK WinCreateNotifyProc(
HWINEVENTHOOK hEvent,
DWORD  event,
HWND  hwndMsg,
LONG  idObject,
LONG  idChild,
DWORD  idThread,
DWORD  dwmsEventTime
)
{
  
  if( event != EVENT_OBJECT_CREATE)
    return;
  
  char bufferName[256];
  IAccessible *pacc=NULL;
  VARIANT varChild;
  VariantInit(&varChild);
  //得到触发事件的 UI 元素的 IAccessible 接口/子ID对
  HRESULT hr= AccessibleObjectFromEvent(hwndMsg,
                     idObject,
                     idChild,
                     &pacc,
                     &varChild);
  
  if(!SUCCEEDED(hr))
  {
    VariantClear(&varChild);
    return;
  }
  //得到 UI 元素的Name,并比较,如果是"运行"就发送消息给主线程。
  GetObjectName(pacc, &varChild, bufferName, sizeof(bufferName));
  if(strstr(bufferName, szMainTitle))
    PostThreadMessage(GetCurrentThreadId(),
             WM_TARGET_WINDOW_FOUND,
             0,
             0);
  
  return;
}  

恩…………,一个应用基本成型了,虽然比较简单。就先写这么多吧,请关注后续介绍。

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

Tags:MS Active Accessibility

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