Пользователь
0,1
рейтинг
2 сентября 2011 в 05:01

Разработка → Запускаем 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.
Разумеется, описанный механизм применим и к другим программам.
Андрей @apangin
карма
144,5
рейтинг 0,1
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (68)

  • –22
    я что-то не понимаю, по мне так проще галочку поставить, и не париться…
    • +9
      Какую галочку?
      • –21
        не показывать страничку :)
        • +23
          Где её дают? :)
    • +2
      Примерно с 5.х версии этой галочки нет.
      • –13
        Да? не знал.
        Пользуюсь скайпом с телефона да линя…
        не слежу за вин версией, не думал что они дойдут до такого
      • +2
        Да что же у меня все не как у людей! И версия 5.5, и галочка есть!
        habrastorage.org/storage1/fc76fb5d/413f75d8/fafaf87e/3643f5c7.jpg
        • +3
          А можно скриншот не обрезанный? Вы скорее всего не про то окно.
        • –4
          простите, я балда (но зачем закрывать эту страницу все же не понимаю, не так уж часто я, например, скайп перезапускаю)
          • +10
            Прежде всего, зачем скайпу открывать страницу, которая только раздражает пользователя?
            • –5
              Вы про страницу где фотки популярных контактов и можно «сообщить друзьям свой статус»? Не помню, чтобы она сама собой появлялась, но может это потому, что она меня не раздражает. Страница и страница. Я даже был рад когда она появилась, что перейдя на нее можно закрыть чат, в старых скайпах можно было лишь перейти на другой контакт, если надо было скрыть текущий.
              Ее наполнение меня нисколько не трогает, для меня скайп инструмент: надо написать — я восстановлю окно, выберу человека (часто из «последних») и напишу. Больше не нужен, — скайп сворачивается. Даже представить себе не мог, что все такие раздражительные…
              • +6
                Даже представить себе не мог, что все такие раздражительные…
                <irony> Вы, случаем, не в Skype работаете? GUI-дизайнером, например :) </irony>

                Для меня скайп тоже инструмент, и его фейсбук-фичи мне ну совершенно не нужны. А они навязчиво лезут на экран, и — самое главное — их никак нельзя отключить.
                • –1
                  Неа, не в скайпе ) Фейсбук фичи мне, кстати, тоже не нужны, подбешивает, что после установки их надо все тут же отключить, убрать вкладки и т.п., иначе создают «шум». Кстати, какие именно фичи вам мешают? Может я подскажу что как отключить?
                • –1
                  вот мой скайп, никаких фейсбуков тут нет, версия 5.5.0.113
                  habrastorage.org/storage1/b99924ff/018e5d4d/fcf7d7e4/84b8289d.jpg
                  • 0
                    Дело в том, что у Вас скайп «одним окном» (default view), а мне удобнее предыдущий стиль, когда список контактов отделён от других окон (compact view).

                    В этом режиме при каждом запуске, выходе из сна, а иногда и просто так выскакивает главная страница. Под шестерёнкой справа хотелось бы видеть что-то вроде «никогда не показывать это окно», но там только «связать с фейсбуком».
                    • –1
                      Вот как, теперь понял. Я тоже когда-то любил именно такой вид, но потом перешел на default view и… в общем то ничего не изменилось )

                      Ключом к переходу послужило осознание того, что чтобы переключиться между теми, с кем говоришь, не обязательно болтаться по контакт-листу: все они легкодоступны на вкладке «последние», которая как бы заменяет таб-представление открытых окон. Но, полагаю, не всем это подойдет.
  • +8
    у меня такое ощущение что последний скайп чудит у всех по разному :) у меня при каждом запуске домашнюю страничку не показывает, галочку поставил и оно успокоилось. зато он каждый раз предлагает сфотографироваться на аватарку, причем галочка есть, но не помогает, аватарка есть, поменял на hires, не помогло, сфотографировался, поставил сфотографированную картинку… всеравно просит сфотографироваться на аватарку :)
    • +2
      на ХР (2 виртуалки + 1 ноут) скайп при старте винды висит в трее и не соединяется пока не запустить через иконку в трее или ярлык. на 7 при все «норм» — при старте винды открывается главная страница и т.д.
      • 0
        а у меня наоборот на 7-ке такое. Если честно, то я думал что это новая фича =)
    • +1
      Честно признаться, только из этого поста узнал, что у людей подобные проблемы со Скайпом.
      W7 x64 уже которую версию ведет себя адекватно…
      • 0
        Без разницы какая винда, дело в 5-м скайпе(не помню правда с первого билда или нет). На работе XP, дома W7 x64 — он ведет себя совершенно одинаково. Если не выключаешь комп, он сам вываливает раз в день на экран свои окошки.
    • +1
      У меня, пока не обновил, скайп мог в любой момент сделать себя активным окном.
      Даже если ты играешь в полный экран…

      Теперь он грузит безбожно проц и может сам разорвать связь во время разговора.
      А еще пропала кнопочка стоп-кадр
      • 0
        Есть такая же беда, самопроизвольно периодически разворачивается. Версия — 5.3.32.120
        • 0
          После обновления поставилась неудобная, многжрущая 5.5.0.144
    • 0
      Если не ошибаюсь, в этом окне галочку ставить как раз не надо, надо его просто закрыть alt+f4. Более не появляется.
      • +1
        Ещё как появляется, раз в пару часов всплывает, даже если скайп не трогать.
    • 0
      все равно просит сфотографироваться на аватарку :)

      Ему не понравилась фотка=)
  • +1
    способ, конечно, интересный, а не проще это на AutoIt написать?
    • +2
      Вопрос, конечно, интересный. Но чем это проще и зачем ставить AutoIt, когда можно обойтись без него?
      • 0
        На AutoIt это займёт строчек 8 от силы, плюс не надо ставить компилятор C++
      • 0
        Наверное потому что AutoHotKey у многих и так установлен, да и сделать EXE из скрипта можно. Т.к. AHK это скрипт, то при необходимости можно его руками подправить и ничего не перекомпилировать.
    • +3
      А можно сделать вот такой батник
      pastebin.com/hJrtJZiD
  • +8
    Зря хендлы не закрываете:
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    • –1
      Да, раз уж я упомянул tutorial, надо писать все грамотно. Дописал, спасибо.
  • –4
    Не очень хорошо замораживать SLeep-ом основной поток программы. Лучше вынести это в отдельный поток, а то можно даже идентифицировать программу как подвисающую.
    • +4
      Как раз наоборот хорошо! Оконной функции тут нет, GetMessage() не используется (так бы он замораживал основной поток) — если без Sleep, то программа будет в цикле работать на максимальной скорости и жрать ресурсы впустую. Хотя бы Sleep(0) надо вставлять обязательно, это просто хороший тон и забота об остальных программах.
      • 0
        Да, согласен, без оконной функции и обработчика событий можно.
  • +1
    Что же так все сложно, скайп превращается в квип — прощай скайп.
    • +2
      Вы так говорите, как будто это что-то плохое.
      У скайпа в последние несколько мажорных версий интерфейс стал на столько порядков хуже, чем у квипа, что их даже сравнивать рука не поднимается. И чем дальше, тем ещё хуже.
      • 0
        А что, когда-то у скайпа интерфейс был лучше?
        (Квип если что у меня 9030 RC4, с тех пор не обновляю ибо не за чем).
        • 0
          А что, когда-то у скайпа интерфейс был лучше?

          Лучше квипа имею в виду
          • 0
            Я не знаю как сейчас у квипа, у меня кутим.
  • +1
    Кстати, надоедливая страница у меня иногда всплывает просто среди дня и в обязательном порядке при пробуждении из sleep/hibernate. Лучше бы с этим что-то сделать. Всё таки перезагрузка и выключение компьютера в последнее время становится редким событием.
  • +1
    да, проблема действительно существует, и меня это тоже бесит, но решение не самое лучшее, к сожалению, если не стоит среда разработки ++. К тому же это получается еще дополнительная программа… Буду ждать других решений :/
  • +1
    Не работает, вот скрин. Win7x64en + Skype 5.5.0.114 (compact view)
  • +1
    ERROR_SUCCESS — как поэтично :)
  • +2
    В версии 5.3 есть возможность избавится от окна более гуманным способом.

    «В общем суть в том, что все, что появляется на главной странице, пишется в директорию 'shared_dynco', которая находится по известному адресу '%APPDATA%\Skype'.

    Выключаем совсем Skype, находим директорию shared_dynco и ставим ей атрибут „Только для чтения“. Все что внутри убиваем. Запускаем Skype.
    Если не сработает и в ней снова появится файл dc.db, открываем его в Блокноте, удаляем содержимое, сохраняем и тоже делаем „Только для чтения“. „via
    • 0
      Шикарно) Все работает. Можете продублировать свой камент в моем вопросе?
      • 0
        продублировал
    • 0
      А взять 5.3 можно с сайта oldapps.com.
    • 0
      На 5.5 даже такой варварский метод не работает.
    • 0
      С 5.5.0.113 не прокатило, он непобедим, сволочь.
      • 0
        Мне повезло что оно так и не обновилось. Скачайте с oldapps.com/Skype.html другую версию.

        Кстати, может кто подскажет как перманентно его отучить обновляться? А то периодически виндовс блочит старт автоапдейта
  • 0
    Вот жопошники! В линуксе ей и не пахнет! А ведь по ходу это намек на соцсети.
  • +1
    Не столько бесит сама страница (она, конечно, бесит порядочно), сколько то, что сообщения из ФБ приходят и в мой мессенджер и в Скайп одновременно.
  • 0
    Догадываюсь почему, но почему Скайп (не в Windows) решает, что я в… Афганистане?
  • 0
    Вот зачем вы об этом сказали???((((
    Закрыл скайп — он обновился… и теперь у меня тоже есть это окошко(((((
  • +4
    Вы меня простите, конечно, но этот топик имеет такое же отношение к С++, как компьютер к электростанции. Да он ей пользуется, но и только…
  • +3
    Чтобы избавиться от всплытия (которое мне тоже надоедало) и от facebook в скайпе полностью.
    Нужно скачать Skype — бизнес-версия.
    • 0
      Поставил бизнес версию, и все равно это окно вылезает
      • 0
        Имел ввиду, всплытие окна скайпа поверх других в произвольное время, окно/вкладка «Главная страница Skype», бизнес версия не отменяет.
        • 0
          Ясно, а в чем вообще отличие бизнес версии от обычной?
          • 0
            Основные написал выше: отсутствие вкладки facebook, у многих в обычной версии в последних обновлениях образовалась проблема всплытия окна скайп в произвольные моменты, когда поменял у себя избавился от этого.
            Еще заметил что есть небольшие различия в интерфейсе, например в разговоре с бизнес версии пропал ползунок громкости (хотя возможно предыдущая не бизнес версия была не самой самой последней и тоже изменилась).
  • 0
    skype.exe /nohome /minimized ?)
    • 0
      мне не помогло
    • 0
      не помогает, всеравно вылазит.
  • –1
    немного оффтопик, но, может, кто-то может сделать что-то подобное с панелью баннера в MS Office Starter Edition? (в смысле, автоматически прятать её, когда запускается Word / Excel)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.