Показать сообщение отдельно

Close button killer
  #1  
Старый 01.03.2009, 00:43
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
С нами: 10139366

Репутация: 1502


По умолчанию 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 за пару ценных советов по студии и тест!
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ

Последний раз редактировалось desTiny; 01.03.2009 в 18:29..
 
Ответить с цитированием