Underground InformatioN Center [&articles] | |
[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive] | [home] |
Введение Цель TXT Файл вида ------------ Internet Explorer The Bat! Visual C++ 911 ------------
Если будут найдены окна, содержащие в своем заголовке указанные строки, они будут спрятаны. Опции линкера #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078") #pragma comment(linker,"/ENTRY:New_WinMain") #pragma comment(linker,"/NODEFAULTLIB")На что теперь стоит обратить особое внимание? Обычно точка входа в программу выглядит так: int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szCmdLine,int nCmdShow) (кстати, для Win32 приложений второй параметр всегда NULL) Но(!)... Так как мы отключили "Runtime library", нам теперь передается в этих параметрах
разный мусор. Поэтому называем точку входа не WinMain а New_WinMain, которую объявим, как
void New_WinMain(void), чтобы не забыть о том, что нам ничего не передается. А параметр
HINSTANCE получаем функцией GetModuleHandle(NULL). Ах да, и выходить из программы будем
функцией ExitProcess.
Объявим кое-какие константы // ..................... WIN32_FIND_DATA FindData; HANDLE hFind=FindFirstFile(szFilterStringsFile,&FindData); if (hFind!=INVALID_HANDLE_VALUE) { i=(FindData.nFileSizeHigh * MAXDWORD) + FindData.nFileSizeLow; HGLOBAL hGA=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE,i+1); // (+ end-ZERO) if (hGA!=NULL) { LPVOID lpStrings=GlobalLock(hGA); DWORD dw; if (lpStrings!=NULL) ReadFile(hFile,lpStrings,i,&dw,NULL); } } FindClose(hFind); CloseHandle(hFile); // ............................... // Но так как вряд ли файл настроек у нас будет больше одного // килобайта, я оставил статичный массив. ) Зададим глобальные переменные Функции Пройдемся по главным строкам функции NewWinMain WNDCLASS wc; wc.style = CS_HREDRAW|CS_VREDRAW ; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); wc.lpszClassName = "CKMINT21WINDOWSHIDERPRO"; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.lpszMenuName=NULL; wc.cbClsExtra=0; wc.cbWndExtra=0; if (!RegisterClass(&wc)) MessageBox(0,"I can't register window class.","Error:",0), ExitProcess(0);* Создаем главное окно приложения hwndMain=CreateWindow(wc.lpszClassName,"Small windows hider!", WS_BORDER|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, CW_USEDEFAULT,0,291,180, NULL, NULL, hInst, NULL); И помещаем на него две кнопки. Как видим, кнопки имеют класс "BUTTON". Они являются дочерними окну hwndMain. hwndButtonHide=CreateWindow("BUTTON","Hide!", WS_VISIBLE | WS_CHILD , 10,10,261,90, hwndMain, NULL, hInst, NULL); ShowWindow(hwndButtonHide,SW_SHOW), UpdateWindow(hwndButtonHide); hwndButtonEditFilter=CreateWindow("BUTTON","Edit filters", WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP , 10,110,261,30, hwndMain, NULL, hInst, NULL); ShowWindow(hwndButtonEditFilter,SW_SHOW), UpdateWindow(hwndButtonEditFilter); Наконец, показываем главное окно ShowWindow(hwndMain,SW_SHOW), UpdateWindow(hwndMain); Примечание: Так как кто-то этого может не знать, хочу отметить, что в языке С++ есть "операция следования" - запятая. Т.е. просто последовательно выполнятся обе функции ShowWindow и UpdateWindow (как отдельный блок). В вышеуказанной строке можно было бы и просто поставить ";", а вообще иногда это помогает избавиться от огромного количества фигурных скобок {}, в тексте программы. * Затем регистрируем в системе HotKeys. Они будут привязаны к главному окну, которому будут передаватся сообщения WM_HOTKEY.RegisterHotKey(hwndMain,HOTKEYHIDE,MOD_CONTROL,VK_F12) RegisterHotKey(hwndMain,HOTKEYSHOW,MOD_CONTROL,VK_F10) * Затем считываем настройки из файла и запускаем главный цикл обработки оконных сообщений для текущего процесса. MSG msg; while(GetMessage(&msg,NULL,0,0)) TranslateMessage(&msg), DispatchMessage(&msg); Оконная процедура // Тут все довольно стандартно. Делаем switch (msg). // ... case WM_HOTKEY: if (HOTKEYSHOW == (int)wParam) // показываем все, что мы до этого прятали, а так же главное // окно программы ShowAll(), ShowWindow(hwnd,SW_SHOW); if (HOTKEYHIDE == (int)wParam) // Скрываем наше главное окно и запускаем перебор всех окон в // системе - EnumWindows. Теперь будет вызываться функция // my_EnumWindowsProc для каждого обнаруженного в системе окна. ShowWindow(hwnd,SW_HIDE), EnumWindows((int (__stdcall *)(struct HWND__ *,long))my_EnumWindowsProc, 0); break; // ... // Если программу пытаются минимизировать, просто скрываем ее // ......................... case WM_SYSCOMMAND: if(SC_MINIMIZE == wParam) { ShowWindow(hwnd,SW_HIDE); return 0; } break; // Внимание, после ShowWindow(hwnd,SW_HIDE) мы пишем return 0, // вместо break. Почему? Да потому что не хотим, чтобы это // сообщение пошло дальше в систему. Мы его уже обработали // по-своему. // ... // А затем обрабатываем нажатия на кнопки. case BN_CLICKED: if (hwndButtonHide==(HWND)lParam)ShowWindow(hwndMain,SW_HIDE); if (hwndButtonEditFilter==(HWND)lParam)ShellExecute(NULL,"open", szFilterStringsFile,NULL,NULL,SW_SHOWMAXIMIZED); break; Рассмотрим функцию my_EnumWindowsProc for(i=0;i<MAXFIL;i++) if (FilterStrings[i]) // если это начало строки, то { if (Contain(szWindowsTitle, FilterStrings+i)) HideNext(hwnd); // скроем окно, если эта строка содержится в szWindowsTitle while(FilterStrings[i]) i++; // сместим указатель на следующий 0 }Продолжаем дальнейший перебор окон return TRUE; (Если бы было return FALSE, перебор бы закончился.) В остальных функциях особо описывать нечего. FAQ, возникший в результате множества заданных мне вопросов. Links: Special thanks: Dr.Golova[uinC], NiFi[uinC].
[c] Copyright 2002. Украина, Запорожье.
KMiNT21 (mailto:kmint21@mail.ru). Замечания/пожелания/поправления/дополнения всегда приветствуются.
Статья написана специально для UInC (www.uinc.ru).
Все документы и программы на этом сайте собраны ТОЛЬКО для образовательных целей, мы
не отвечаем ни за какие последствия, которые имели место как следствие использования
этих материалов\программ. Вы используете все вышеперечисленное на свой страх и риск. |
[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive] | [home] |
Underground InformatioN Center [&articles] |
2000-2015 © uinC Team |