gpt4 book ai didi

delphi - 检测Skype是否位于 "Compact View"或 "Default View"

转载 作者:行者123 更新时间:2023-12-03 15:47:11 25 4
gpt4 key购买 nike

我的应用程序的运行方式由 Skype 的 View 模式决定,因为我的应用程序正在寻找类 TConversationWindow 的窗口,如果在默认 View 中,该窗口是 的子级tSkMainForm,如果在紧凑 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;

上面的函数将通过检查其父级是否有文本来查找顶级(除非我弄错了 - 没有窗口父级的窗口)TConversationForm。如果 Skype 处于默认 View ,则 TConversationFormtSkMainForm 的子级,后者始终包含一些文本。它按预期工作。

现在解决实际问题:每当用户在两个 View 之间切换时,顶级 TConversationForm 都不会“刷新”。它们消失了,但为了让它再次显示为 tSkMainForm 的子项(因此更改在 Winspector Spy 中可见),您必须在 Skype 中选择它,我不能依赖用户来做到这一点。

如果您不知道,以下是这两种 View 之间的区别:

紧凑 View

Compact View

默认 View

Default View

如果您需要更多信息,请告诉我,谢谢!

最佳答案

不要使用 Windows 方法检测 Skype 是否处于“紧凑 View ”或“默认 View ”,而是尝试读取存储此类设置并在“实时”中更新的 config.xml 文件。时间”通过 Skype。该文件位于

%AppData%\Skype\<your-skype-user-name>

例如在 Windows 7 中,这是位置

C:\Users\<your windows user>\AppData\Roaming\Skype\<your-skype-user-name>

此文件内部存在一个名为 MultiWindowMode 的条目

这是MultiWindowMode的Xpath位置

/config/UI/General/MultiWindowMode'

此条目的值为“1”(表示“紧凑 View ”)和“0”(表示“默认 View ”)

查看此演示,它使用 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.

关于delphi - 检测Skype是否位于 "Compact View"或 "Default View",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com