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;
}
恩…………,一个应用基本成型了,虽然比较简单。就先写这么多吧,请关注后续介绍。
Tags:MS Active Accessibility
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接