Jef*_*eff 3 delphi skype window-handles hierarchy
我的应用程序运行的方式由Skype的视图模式决定,因为我的应用程序正在寻找类的窗口TConversationWindow
,如果在默认视图中是一个子窗口tSkMainForm
,并且如果在Compact View中,它不是子窗口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;
Run Code Online (Sandbox Code Playgroud)
上面的函数将TConversationForm
通过检查父级是否有文本来查找顶级(除非我弄错了 - 没有父窗口的窗口).如果Skype处于默认视图中,那么TConversationForm
它们就是孩子们tSkMainForm
,并且总是有一些文本.它按预期工作.
现在针对实际问题:每当用户在2个视图之间切换时,顶级的视图TConversationForm
都不会"刷新".它们消失得很好,但是为了让它tSkMainForm
再次成为一个孩子(所以在Winspector Spy中可以看到变化),你必须在Skype中选择它,我不能依赖用户这样做.
万一你不知道,这是两个视图之间的区别:
如果您需要更多信息,请告诉我,谢谢!
而不是使用Windows方法检测Skype是否处于"压缩视图"或"默认视图"中,而是尝试读取存储这些设置的config.xml文件,并通过Skype"实时"更新.此文件位于
%AppData%\Skype\<your-skype-user-name>
Run Code Online (Sandbox Code Playgroud)
例如,在Windows 7中,这是位置
C:\Users\<your windows user>\AppData\Roaming\Skype\<your-skype-user-name>
Run Code Online (Sandbox Code Playgroud)
在这个文件里面存在一个名为的条目 MultiWindowMode
这是Xpath的位置 MultiWindowMode
/config/UI/General/MultiWindowMode'
Run Code Online (Sandbox Code Playgroud)
对于"精简视图",此条目的值为"1",对于"默认视图",该条目的值为"0"
检查这个演示,它使用XPath来解析文件并读取其值MultiWindowMode
.
{$APPTYPE CONSOLE}
uses
ComObj,
ActiveX,
Variants,
SysUtils;
function SkypeISCompactView(const SettingsFile : string) : Boolean;
var
XmlDoc : OleVariant;
Node : OleVariant;
begin
Result:=False;
if FileExists(SettingsFile) then
begin
XmlDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
try
XmlDoc.Async := False;
XmlDoc.Load(SettingsFile);
XmlDoc.SetProperty('SelectionLanguage','XPath');
if (XmlDoc.parseError.errorCode <> 0) then
raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]);
Node :=XmlDoc.selectSingleNode('/config/UI/General/MultiWindowMode');
if not VarIsClear(Node) then
Result:=Node.text='1';
finally
XmlDoc:=Unassigned;
end;
end;
end;
begin
try
CoInitialize(nil);
try
Writeln(BoolToStr(SkypeISCompactView('C:\Users\<your windows user>\AppData\Roaming\Skype\<skype user>\config.xml'),True));
except
on E:Exception do
begin
Writeln(E.Classname, ':', E.Message);
end;
end;
finally
CoUninitialize;
end;
Readln;
end.
Run Code Online (Sandbox Code Playgroud)