DLL 中的等待问题 |
缺席
|
KFC123_60201
一般會員 發表:58 回覆:18 積分:15 註冊:2006-07-25 發送簡訊給我 |
我写了一个DLL,其中调用到一个外部函数库的其中一个函式,这个函式会打开一个窗口。我想subclass这个窗口然后监控它的message
function EnumSearchProc(_AHWnd: HWnd; LPARAM: lParam): boolean; stdcall; var WndClassName: array[0..254] of char; WndCaption: array[0..254] of char; begin GetClassName(_AHWnd, @WndClassName, 254); GetWindowText(_AHWnd, @WndCaption, 254); if ( AnsiSameText(string(WndClassName),'#32770') AND AnsiSameText(string(WndCaption), 'xxxxxx) ) then begin aWnd:= _AHWnd; Result := False; end; Result := True; end; procedure foo; begin // 调用外部函数库中的一个函式,它会打开一个窗口 OpenEDialog(); MessageBox(0, 'Wait...', '', 0); EnumChildWindows(0, @EnumSearchProc, _aWnd); ... SetWindowLong(m_aWnd, GWL_WNDPROC, LongInt(m_NewWinProc)); // m_NewWinProc 是callback proc ... end; 当外部函数 OpenEDialog() 打开一个窗口后,由于它不会返回handle,所以无法宜接把subclass。但我知道这个窗口的类型和caption,所以想通过搜索的方法来取得它的handle。当取得hanlde后就使用setwindowlong来进行subclass。然后,当OpenEDialog打开窗口后,如果立即调用EnumChildWindows进行窗口搜索,一般都是失败的,因此,我加入了MessageBox来等待那个窗口完全被调出以后再搜索。但这样每次都要按键来确认也太麻烦了,我想写个delay函数来代替它。我试用 sleep 函数来实现延迟,但不管延迟多久,还是无法正确搜到那个窗口(只有用MessageBox时才能搜到窗口)。我后来想到加入下面一段delay代码 aTickCount := GetTickCount(); repeat Application.ProcessMessages; Now := GetTickCount(); until (Now - aTickCount >= 1000) or (Now < aTickCount); 但是由于我写的是DLL,没有 Application.ProcessMessages; 所以这个方法又不行。请问除了使用Timer以外,还有没有更直接的方法呢? 谢谢 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |