Close button killer

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by desTiny, 28 Feb 2009.

  1. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Прелюдия:

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

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

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

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

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

    http://slil.ru/27008900

    Сорцы:
    unclose.dll :
    Code:
    #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
    Code:
    #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 за пару ценных советов по студии и тест!
     
    #1 desTiny, 28 Feb 2009
    Last edited: 1 Mar 2009