检测Skype是处于“紧凑视图”还是“默认视图”

时间:2011-06-30 22:03:39

标签: delphi hierarchy skype window-handles

我的应用程序运行方式由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处于默认视图中,则TConversationFormtSkMainForm的子项,其中始终包含一些文本。它按预期工作。

现在针对实际问题:每当用户在2个视图之间切换时,顶级TConversationForm都不会“刷新”。它们消失得很好,但是为了让它再次显示为tSkMainForm的孩子(所以在 Winspector Spy 中可以看到更改),你必须在Skype中选择它,我不能依靠用户来做到这一点。

如果你不知道,这是两个观点之间的区别:

精简视图

Compact View

默认视图

Default View

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

1 个答案:

答案 0 :(得分:7)

不使用Windows方法检测Skype是处于“压缩视图”还是“默认视图”,而是尝试读取存储这些设置的 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”,“默认视图”的值为“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.