Поводом к написанию заметки послужил недавний вопрос. Меня тоже очень раздражает окно Skype Home, появляющееся при каждом запуске, однако с помощью простой программы на C мне удалось от него избавиться. Получилось нечто вроде Hello World Tutorial по использованию Windows API. Программу можно скачать тут, а исходник с описанием найдете под катом.
С помощью Visual Studio:
С помощью GCC (MinGW):
Примечание:
В Скайпе должен быть выбран вид Compact View.
Проверено на Windows 7 и Skype 5.5.0.
Разумеется, описанный механизм применим и к другим программам.
Алгоритм на словах
- Узнаем из реестра путь, куда установлен Skype.
Он прописан в HKEY_CURRENT_USER\Software\Skype\Phone\SkypePath. - Запустим Skype.exe в новом процессе.
- С момента запуска Skype будем в течение 30 секунд искать окно с заголовком «Skype Home» или «Главная страница Skype». Получим хэндл окна и дождемся, пока оно станет видимым.
- Отправим этому окну сообщение 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.
Разумеется, описанный механизм применим и к другим программам.