Определение, находится ли Skype в «компактном представлении» или «представлении по умолчанию» - PullRequest
3 голосов
/ 01 июля 2011

Способ работы моего приложения определяется режимом просмотра Skype из-за того, что мое приложение ищет окна класса TConversationWindow, которые, если в режиме просмотра по умолчанию является дочерним элементом tSkMainForm, а если в Compact Видите, это не ребенок 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 верхнего уровня не «обновляются». Они исчезают в порядке, но для того, чтобы он снова появился как ребенок tSkMainForm (так что изменение видно в Winspector Spy ), вам нужно выбрать его в Skype, и я не могу полагаться на пользователь, чтобы сделать это.

В случае, если вы не знаете, вот разница между двумя видами:

Компактный вид

Compact View

Вид по умолчанию

Default View

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, спасибо!

1 Ответ

7 голосов
/ 01 июля 2011

Вместо того, чтобы определять, находится ли Skype в «компактном представлении» или «представлении по умолчанию» с использованием подхода Windows, попробуйте прочитать файл config.xml , который хранит настройки такого рода и обновляется в режиме реального времени "по скайпу. Этот файл находится в

%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.
...