![]() |
Библиотека Интернет Индустрии I2R.ru |
||
![]() ![]() |
Написание экстра-маленьких Win32 приложений на С++ от 1 КБ используя лишь API, на примере программы Windows HiderЭтот документ былвзят с сайта UinC.ru Введение Цель 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Продолжаем дальнейший перебор окон return TRUE; (Если бы было return FALSE, перебор бы закончился.) В остальных функциях особо описывать нечего. Links: |
|
![]() |
![]() |
2000-2008 г. Все авторские права соблюдены. |
![]() |
![]() |
![]() |
![]() |