Программирование на C++ глазами хакера


Переключение экранов - часть 2


Создайте новый проект Win32 Project и перейдите в функцию _tWinMain. Воспользуйтесь листингом 3.2 и до цикла обработки сообщений напишите необходимый для перемещения окон код.

Листинг 3.2. Код перемещения окон
HANDLE h=CreateEvent(0, true, false, "et");

//Бесконечный цикл while (TRUE) { int windowCount; int index; HWND winlist[10000]; HWND w; RECT WRct;

for (int i=0; i<GetSystemMetrics(SM_CXSCREEN); i++) { //Считаем окна windowCount=0; w=GetWindow(GetDesktopWindow(),GW_CHILD); while (w!=0) { if (IsWindowVisible(w)) { winlist[windowCount]=w; windowCount++; } w=GetWindow(w,GW_HWNDNEXT);//Искать следующее окно } // Начало сдвига HDWP MWStruct=BeginDeferWindowPos(windowCount);//Начинаем сдвиг

// Определяем окна, которые надо сдвигать for (int index=0; index<windowCount; index++) { GetWindowRect(winlist[index], &WRct); MWStruct=DeferWindowPos(MWStruct, winlist[index], HWND_BOTTOM, WRct.left-10, WRct.top, WRct.right-WRct.left, WRct.bottom-WRct.top, SWP_NOACTIVATE || SWP_NOZORDER); } // Конец сдвига EndDeferWindowPos(MWStruct);//Конец сдвига }

WaitForSingleObject(h,2000); //Задержка в 2000 миллисекунд }

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

После этого запускается бесконечный цикл с помощью вызова while (true). Внутри цикла код делится на три маленькие части: сбор указателей на окна, сдвиг окон и задержка в 10 секунд. С задержкой мы уже сталкивались не один раз, и она вам уже должна быть знакома.

Сбор активных окон происходит следующим образом:

// Считаем окна w=GetWindow(GetDesktopWindow(), GW_CHILD); while (w!=0) { if (IsWindowVisible(w)) { winlist[windowCount]=w; windowCount++; }

w=GetWindow(w, GW_HWNDNEXT); // Искать следующее окно }

В первой строчке получаем указатель первого окна на Рабочем столе и записываем его в переменную w. Потом начинается цикл, который будет выполняться, пока полученный указатель не станет равным нулю, т.е. пока не переберем все окна.

В этом цикле, прежде чем запомнить указатель, происходит проверка видимости окна с помощью функции IsWindowVisible с параметром w. Если окно невидимо или свернуто (функция возвращает FALSE), то нет смысла его перемещать, в противном случае — указатель сохраняется в массиве winlist и увеличивается счетчик windowCount.




Начало  Назад  Вперед



Книжный магазин