我现在想出了一些我还不能打破的新东西,但它仍然感觉很像伏都教。通过观察,我发现我想要的窗口总是似乎是第一个返回的窗口,EnumWindows
但它不(尚未)可见,即IsWindowVisible
返回False
(请记住,我是Inspector.Activate
在检查器显示之前从事件的第一次发生内部调用此代码首次)。
如果有人知道更好的解决方案或有充分理由解释为什么这样做(最好带有权威文档的链接),请发表回复。
更新:所以,根据要求,这里有一些实际的(Delphi)代码。请注意,这不是我的工作代码,其中包含与此问题无关的其他一些内容,这些内容已在此处删除。
function GetWindowClassName(const AHandle: HWND): String;
var
lClass: array[0..255] of Char;
begin
if GetClassName(AHandle, lClass, SizeOf(lClass)) > 0 then
Result := lClass
else
Result := '';
end;
type
TWordSearchInfo = record
Result: HWND;
end;
PWordSearchInfo = ^TWordSearchInfo;
function CheckWnd(AWnd: HWND; ASearchInfo: PWordSearchInfo): Boolean; stdcall;
begin
Result := True;
try
if GetWindowClassName(AWnd) = 'OpusApp' then
if not IsWindowVisible(AWnd) then
begin
ASearchInfo.Result := AWnd;
Exit(False);
end;
except
//plop!
end;
end;
function GetNewestWordHandle: Cardinal;
var
lSearchInfo: TWordSearchInfo;
begin
lSearchInfo.Result := 0;
EnumWindows(@CheckWnd, Integer(@lSearchInfo));
Result := lSearchInfo.Result;
end;
注意:我只在检查员的 -event 中使用此功能,Activate
并且当 Outlook 主要版本 < 12 并且检查员的IsWordMail
-property 为True
.