【发布时间】:2011-09-26 08:45:16
【问题描述】:
我的应用程序的运行方式由 Skype 的视图模式决定,因为我的应用程序正在寻找 TConversationWindow 类的窗口,如果在默认视图中是 tSkMainForm 的子窗口,如果在紧凑视图中看,它不是tSkMainForm的孩子。
这是我尝试做的:
Function IsCompactView:Boolean;
Var
Wnd : Hwnd;
Begin
Result := True;
Wnd := FindWindow('TConversationForm',nil);
if Wnd <> 0 then
begin
Wnd := GetParent(Wnd);
// Custom function that grabs the Window Text
if GetHandleText(Wnd) <> '' then
Result := False;
end;
End;
上述函数将通过检查其父级是否有文本来查找顶级(除非我弄错了 - 没有窗口父级的窗口)TConversationForm。如果 Skype 在默认视图中,TConversationForm 是 tSkMainForm 的子代,tSkMainForm 总是有一些文本。它按预期工作。
现在解决实际问题:每当用户在两个视图之间切换时,顶级TConversationForm 不会“刷新”。它们消失得很好,但为了让它再次显示为 tSkMainForm 的子项(因此更改在 Winspector Spy 中可见),您必须在 Skype 中选择它,我不能依赖用户这样做。
如果你不知道,这里是 2 个视图之间的区别:
精简视图
默认视图
如果您需要更多信息,请告诉我,谢谢!
【问题讨论】:
-
+1 因为这可能是您问过的最明确的问题。不错的工作! (不过有一个小小的抱怨:可能应该包含“抓取窗口文本的自定义函数”代码,因为它可能会有所作为。不过,改进了很多。)
-
我只是好奇,它是什么组件(tskmainform)?你能告诉我吗?
-
@ArionaRian - 我相信这是 Skype 开发的自定义组件。它是 Skype 的主要形式。
标签: delphi hierarchy skype window-handles