关于机房惨案
  • 板块灌水区
  • 楼主MrPython小河狸贝瓦
  • 当前回复16
  • 已保存回复16
  • 发布时间2023/4/16 10:05
  • 上次更新2023/10/23 18:19:46
查看原帖
关于机房惨案
679581
MrPython小河狸贝瓦楼主2023/4/16 10:05

楼主不习惯锁屏 有什么好主意防止/整蛊机惨我的人?

我之前有个主意 监听键盘 监听到AK IOI等关键字后自动锁屏 (网上抄的)

// Test_Concole.cpp : 定义控制台应用程序的入口点。
//

#include <windows.h>
#include <conio.h>
#include <tchar.h>
#include <deque>

using namespace std;

HHOOK keyboardHook = 0;		// 钩子句柄

deque<DWORD> str;

LRESULT CALLBACK LowLevelKeyboardProc(
	_In_ int nCode,		// 规定钩子如何处理消息,小于 0 则直接 CallNextHookEx
	_In_ WPARAM wParam,	// 消息类型
	_In_ LPARAM lParam	// 指向某个结构体的指针,这里是 KBDLLHOOKSTRUCT(低级键盘输入事件)
	){
    KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;		// 包含低级键盘输入事件信息
	/*
	typedef struct tagKBDLLHOOKSTRUCT {
		DWORD     vkCode;		// 按键代号
		DWORD     scanCode;		// 硬件扫描代号,同 vkCode 也可以作为按键的代号。
		DWORD     flags;		// 事件类型,一般按键按下为 0 抬起为 128。
		DWORD     time;			// 消息时间戳
		ULONG_PTR dwExtraInfo;	// 消息附加信息,一般为 0。
	}KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;
	*/
    if(ks->flags == 128 || ks->flags == 129)
    {
        if (ks->vkCode==0x08&&!str.empty()){ //backspace
            //printf("\b\b\b\b");
            str.pop_back();
        }
        else if (ks->vkCode!=0x20&&ks->vkCode!=0x08&&ks->vkCode!=0xA1&&ks->vkCode!=0xA0&&ks->vkCode!=0x0D){
            //printf("%03d ",ks->vkCode);
            str.push_back(ks->vkCode);
        }
        if (str.size()>100) str.pop_front();
        if (str.size()>=3&&*(str.crbegin()+2)==73&&*(str.crbegin()+1)==79&&*(str.crbegin()+0)==73)
            system("rundll32.exe user32.dll,LockWorkStation"),
            str.clear();
        if (str.size()>=2&&*(str.crbegin()+1)==65&&*(str.crbegin()+0)==75)
            system("rundll32.exe user32.dll,LockWorkStation"),
            str.clear();
        if (str.size()>=8&&*(str.crbegin()+7)==65&&*(str.crbegin()+6)==65&&*(str.crbegin()+5)==65&&*(str.crbegin()+4)==65&&*(str.crbegin()+3)==65&&*(str.crbegin()+2)==65&&*(str.crbegin()+1)==65&&*(str.crbegin()+0)==65)
    }

	// 将消息传递给钩子链中的下一个钩子
    return CallNextHookEx(nullptr, nCode, wParam, lParam);
}

int _tmain(int argc, _TCHAR* argv[])
{
	// 安装钩子
	keyboardHook = SetWindowsHookEx(
		WH_KEYBOARD_LL,			// 钩子类型,WH_KEYBOARD_LL 为键盘钩子
		LowLevelKeyboardProc,	// 指向钩子函数的指针
		GetModuleHandleA(nullptr),	// Dll 句柄
		0					
		);
    if (keyboardHook == 0) exit(0xc0000005);

    //不可漏掉消息处理,不然程序会卡死
    MSG msg;
    while(1)
    {
		// 如果消息队列中有消息
        if (PeekMessageA(
			&msg,		// MSG 接收这个消息
			nullptr,		// 检测消息的窗口句柄,nullptr:检索当前线程所有窗口消息
			0,		// 检查消息范围中第一个消息的值,nullptr:检查所有消息(必须和下面的同时为nullptr)
			0,		// 检查消息范围中最后一个消息的值,nullptr:检查所有消息(必须和上面的同时为nullptr)
			PM_REMOVE	// 处理消息的方式,PM_REMOVE:处理后将消息从队列中删除
			)){
				// 把按键消息传递给字符消息
				TranslateMessage(&msg);

				// 将消息分派给窗口程序
				DispatchMessageW(&msg);
		}
        else
            Sleep(0);    //避免CPU全负载运行
    }
	// 删除钩子
    UnhookWindowsHookEx(keyboardHook);

	return 0;
}

不过他用空格绕过去了 还有什么办法吗

2023/4/16 10:05
加载中...