PDA

Просмотр полной версии : Close button killer


desTiny
01.03.2009, 00:43
Прелюдия:

Я всегда выключаю комп в спящий режим. Как следствие, набирается много всяких программ, вкладок в опере и тп. И часто случается так, что при случайно нажатии несколько раз в правом верхнем углу экрана убивается и то, что убивать бы не хотелось. Это побудило меня накодить такую мини-программу.

Мануал:
Запускаем прогу, и кликаем по окну, на котором мы хотим убрать крестик, удерживая ctrl и shift.

Программа завершается через 10 секунд сама.

ctrl+shift+Q также её отключает.

Откомпилено (~3кб):

http://slil.ru/27008900

Сорцы:
unclose.dll :

#pragma comment(linker, "/MERGE:.data=.text /ENTRY:DllMain /MERGE:.rdata=.text /ALIGN:512")
#define Export EXTERN_C __declspec(dllexport)
#include "windows.h"
#pragma section("hk",read,write,shared)
Export __declspec(allocate("hk")) HHOOK SysHook = NULL;
__declspec(allocate("hk")) BOOL off = false;
Export LRESULT CALLBACK Hook(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode < 0 || off)
return CallNextHookEx(SysHook, nCode, wParam, lParam);
MSG* msg = (MSG*)lParam;
if (msg->message == WM_LBUTTONDOWN){
if (msg->wParam & (MK_CONTROL | MK_SHIFT)){
MessageBeep(-1);
HWND Handle = msg->hwnd, par;
while (par = GetParent(Handle))
Handle = par;
DeleteMenu(GetSystemMenu(Handle, 0), SC_CLOSE, MF_BYCOMMAND);
SendMessage(Handle, WM_PAINT, 0, 0);
return 1;
}
}
if (msg->message == WM_KEYDOWN){
if (msg->wParam == 81 && GetKeyState(VK_CONTROL)<0 && GetKeyState(VK_SHIFT)<0){
MessageBeep(-1);
off = 1;
UnhookWindowsHookEx(SysHook);
FreeLibrary(GetModuleHandle(NULL));
return 1;
}
}
return CallNextHookEx(SysHook, nCode, wParam, lParam);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{

return TRUE;
}


main.cpp

#include "windows.h"
#pragma comment(linker, " /MERGE:.data=.text /MERGE:.rdata=.text /ALIGN:512 /ENTRY:WinMain")
#define LIBRARY "unclose.dll"
wParam, LPARAM lParam);
static HINSTANCE Lib = NULL;
static HHOOK* SysHk = NULL;
HOOKPROC HookProc = NULL;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Lib = LoadLibraryA(LIBRARY);
if (!Lib)
return -1;
HookProc = (HOOKPROC) GetProcAddress(Lib, "Hook");
if (!HookProc)
return -2;
SysHk = (HHOOK*) GetProcAddress(Lib, "SysHook");
if (!SysHk)
return -3;
*SysHk = SetWindowsHookEx(WH_GETMESSAGE, HookProc, Lib, NULL);
if (!*SysHk)
return -4;
Sleep(10000);
UnhookWindowsHookEx(*SysHk);
FreeLibrary(Lib);
return 0;
}


PS ура, опера теперь не убиваема!

PPS щелчок по заголовку окна не засчитывается :)

Greetz 2 Terrific за пару ценных советов по студии и тест!