Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Close button killer (https://forum.antichat.xyz/showthread.php?t=108532)

desTiny 01.03.2009 00:43

Close button killer
 
Прелюдия:

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

Мануал:
Запускаем прогу, и кликаем по окну, на котором мы хотим убрать крестик, удерживая 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 за пару ценных советов по студии и тест!


Время: 14:10