3

我的应用程序的运行方式由 Skype 的视图模式决定,因为我的应用程序正在寻找 class 的窗口TConversationWindow,如果在 Default View 中是 的子级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;

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

现在解决实际问题:每当用户在两个视图之间切换时,顶级的TConversationForm's 都不会“刷新”。它们消失得很好,但是为了让它再次显示为子项(因此更改在Winspector SpytSkMainForm中可见),您必须在 Skype 中选择它,我不能依赖用户来执行此操作。

如果您不知道,以下是 2 个视图之间的区别:

紧凑视图

紧凑视图

默认视图

默认视图

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

4

1 回答 1

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

这是 Xpath 的位置MultiWindowMode

/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.
于 2011-06-30T22:52:57.610 回答