線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1598
推到 Plurk!
推到 Facebook!

DLL 中的等待问题

缺席
KFC123_60201
一般會員


發表:58
回覆:18
積分:15
註冊:2006-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-14 05:46:20 IP:59.107.xxx.xxx 訂閱
我写了一个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以外,还有没有更直接的方法呢?

谢谢
系統時間:2024-03-29 5:00:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!