2 September 2011

Запускаем Skype без надоедливой Главной страницы

C++
Поводом к написанию заметки послужил недавний вопрос. Меня тоже очень раздражает окно Skype Home, появляющееся при каждом запуске, однако с помощью простой программы на C мне удалось от него избавиться. Получилось нечто вроде Hello World Tutorial по использованию Windows API. Программу можно скачать тут, а исходник с описанием найдете под катом.


Алгоритм на словах
  1. Узнаем из реестра путь, куда установлен Skype.
    Он прописан в HKEY_CURRENT_USER\Software\Skype\Phone\SkypePath.
  2. Запустим Skype.exe в новом процессе.
  3. С момента запуска Skype будем в течение 30 секунд искать окно с заголовком «Skype Home» или «Главная страница Skype». Получим хэндл окна и дождемся, пока оно станет видимым.
  4. Отправим этому окну сообщение WM_CLOSE, чтобы автоматически его закрыть.

Текст программы runskype.c

#include <windows.h>

BOOL RunSkype() {
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  HKEY key;
  BYTE appPath[512];
  DWORD pathSize = sizeof(appPath);
  BOOL result = FALSE;

  // В реестре по ключу HKEY_CURRENT_USER\Software\Skype\Phone\SkypePath найдем полный путь к Skype
  if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Skype\\Phone", 0, KEY_READ, &key)==ERROR_SUCCESS) {
    if (RegQueryValueEx(key, "SkypePath", NULL, NULL, appPath, &pathSize)==ERROR_SUCCESS) {
      // Используем полученный путь для запуска Skype.exe в новом процессе
      ZeroMemory(&si, sizeof(si));
      si.cb = sizeof(si);
      result = CreateProcess(appPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    }
    RegCloseKey(key);
  }
  return result;
}

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  if (RunSkype()) {
    // В течение 30 секунд с момента запуска Skype будем искать окно с заголовком Skype Home
    int i;
    for (i = 0; i < 3000; i++) {
      // Класс окна THomeForm подсмотрели с помощью программы Inspect Objects из Windows SDK
      // Если не нашли "Skype Home", пробуем русскоязычный вариант "Главная страница Skype"
      HWND wnd = FindWindow("THomeForm", "Skype Home");
      if (!wnd) {
        wnd = FindWindow("THomeForm", "Главная страница Skype");
      }
      // Окно обязательно должно быть видимым, прежде чем его можно будет закрыть
      if (wnd && IsWindowVisible(wnd)) {
        SendMessage(wnd, WM_CLOSE, 0, 0);
        return 0;
      }
      // Если окно не найдено, повторяем попытку через 10 мс
      Sleep(10);
    }
  }
  return 1;
}


Компиляция

С помощью Visual Studio:
cl user32.lib advapi32.lib runskype.c

С помощью GCC (MinGW):
gcc -o runskype.exe runskype.c

Примечание:
В Скайпе должен быть выбран вид Compact View.
Проверено на Windows 7 и Skype 5.5.0.
Разумеется, описанный механизм применим и к другим программам.
Tags:skypeглавная страницаwindows api
Hubs: C++
+32
19.4k 39
Comments 68