屏蔽系统热键的DLL文件制作

这个博客介绍了一个DLL库,包含函数用于锁定桌面、隐藏任务栏、禁用Ctrl+Alt+Del和任务切换键。通过设置鼠标和键盘钩子以及修改系统参数来实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WINLOCKDLL.H文件:
WINLOCKDLL.C文件:
/***********************************************************************
 * WinLockDLL - Library containing functions to Lock Desktop, Taskbar, *
 *              and disable Ctrl+Alt+Del and task switching keys.      *
 *                                                                     *
 * (c) A. Miguel Feij鉶, 1/12/2004                                     *
 ***********************************************************************/

#ifndef WINLOCKDLL_H
#define WINLOCKDLL_H

typedef struct _THREAD_DATA
{
 HDESK hDesk;
 char  szDesktopName[20];
} THREAD_DATA;

#ifdef  _DLL_
#define DLL_EXP_IMP __declspec(dllexport)
#else
#define DLL_EXP_IMP extern "c"__declspec(dllimport)
#endif

DLL_EXP_IMP int WINAPI Desktop_Show_Hide(BOOL bShowHide);
DLL_EXP_IMP int WINAPI StartButton_Show_Hide(BOOL bShowHide);
DLL_EXP_IMP int WINAPI Taskbar_Show_Hide(BOOL bShowHide);
DLL_EXP_IMP int WINAPI Clock_Show_Hide(BOOL bShowHide);
DLL_EXP_IMP int WINAPI Keys_Enable_Disable(BOOL bEnableDisable);
DLL_EXP_IMP int WINAPI AltTab1_Enable_Disable(BOOL bEnableDisable);
DLL_EXP_IMP int WINAPI AltTab2_Enable_Disable(HWND hWnd, BOOL bEnableDisable);
DLL_EXP_IMP int WINAPI TaskSwitching_Enable_Disable(BOOL bEnableDisable);
DLL_EXP_IMP int WINAPI TaskManager_Enable_Disable(BOOL bEnableDisable);
DLL_EXP_IMP int WINAPI CtrlAltDel_Enable_Disable(BOOL bEnableDisable);
DLL_EXP_IMP int WINAPI Thread_Desktop(LPTHREAD_START_ROUTINE ThreadFunc, THREAD_DATA *td);
DLL_EXP_IMP int WINAPI Process_Desktop(char *szDesktopName, char *szPath);

#endif

 

#define     WIN32_LEAN_AND_MEAN
#define     _WIN32_WINNT 0x0400

#include    <windows.h>
#include    <stdlib.h>
#include    "winlockdll.h"
#include    "inject.h"

#define     PROGRAM_MANAGER "Program Manager" // Program manager window name
#define     TASKBAR         "Shell_TrayWnd"  // Taskbar class name
#define     ID_STARTBUTTON  0x130    // Start button ID
#define     ID_TRAY         0x12F    // System tray ID
#define     ID_CLOCK        0x12F    // System clock ID

HHOOK  hHook;          // Mouse hook
HINSTANCE hInst;      // Instance handle

/*************************
 * Mouse Hook procedure. *
 * (Win 9x)              *
 *************************/
LRESULT CALLBACK MouseHookProc(int nCode, WORD wParam, DWORD lParam)
{
 if(nCode >= 0)
 {
        if (wParam == WM_LBUTTONDBLCLK)
        {
            if (((MOUSEHOOKSTRUCT *)lParam)->hwnd == GetDesktopWindow())
            {
                return 1;
            }
        }
 }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}


/***********************************
 * Low Level Mouse Hook procedure. *
 * (Win NT4SP3+)                   *
 ***********************************/
LRESULT CALLBACK LowLevelMouseHookProc(int nCode, WORD wParam, DWORD lParam)
{
 PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT)lParam;
 HWND hWnd = WindowFromPoint(p->pt);

 if(nCode >= 0)
 {
        if ((wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN) && hWnd == GetDesktopWindow())
        {
   return 1;
        }
 }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}


/*************************
 * Hide/Show Desktop.    *
 * TRUE=Show, FALSE=Hide *
 * (Win9x/NT/2K/XP)      *
 *************************/
int DLL_EXP_IMP WINAPI Desktop_Show_Hide(BOOL bShowHide)
{
 OSVERSIONINFO osvi;
 BOOL   bIsWindowsNT4SP3orLater;
 int    iServicePack;
 char           *p;

 // Determine the current windows version
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 GetVersionEx(&osvi);
 for (p = osvi.szCSDVersion; *p  && !isdigit(*p); *p++);
 iServicePack = atoi(p);
 bIsWindowsNT4SP3orLater = (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
                        (((osvi.dwMajorVersion == 4) && (iServicePack >= 3)) ||
            (osvi.dwMajorVersion > 4));

    if (!bShowHide)
    {
        if (!hHook)
  {
            hHook  = SetWindowsHookEx(bIsWindowsNT4SP3orLater ? WH_MOUSE_LL : WH_MOUSE,
           bIsWindowsNT4SP3orLater ? (HOOKPROC)LowLevelMouseHookProc : (HOOKPROC)MouseHookProc,
                                      hInst,
                                      0);
   if (!hHook)
    return 0;
  }
    }
    else
    {
        UnhookWindowsHookEx(hHook);
        hHook = NULL;
    }

    return SetWindowPos(FindWindow(NULL, PROGRAM_MANAGER),
                        NULL,
                        0, 0, 0, 0,
                        bShowHide ? SWP_SHOWWINDOW : SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
}


/***************************
 * Hide/Show Start Button. *
 * TRUE=Show, FALSE=Hide   *
 * (Win9x/NT/2K/XP)        *
 ***************************/
int DLL_EXP_IMP WINAPI StartButton_Show_Hide(BOOL bShowHide)
{
    HWND    hWnd;

    hWnd = GetDlgItem(FindWindow(TASKBAR, NULL), ID_STARTBUTTON);
    if (hWnd == NULL)
        return 0;

    ShowWindow(hWnd, bShowHide ? SW_SHOW : SW_HIDE);
    UpdateWindow(hWnd);

    return 1;
}


/*************************
 * Hide/Show Taskbar.    *
 * TRUE=Show, FALSE=Hide *
 * (Win9x/NT/2K/XP)      *
 *************************/
int DLL_EXP_IMP WINAPI Taskbar_Show_Hide(BOOL bShowHide)
{
    HWND    hWnd;

    hWnd = FindWindow(TASKBAR, NULL);
    if (hWnd == NULL)
        return 0;

    ShowWindow(hWnd, bShowHide ? SW_SHOW : SW_HIDE);
    UpdateWindow(hWnd);

    return 1;
}


/***************************
 * Hide/Show System Clock. *
 * TRUE=Show, FALSE=Hide   *
 * (Win9x/NT/2K/XP)        *
 ***************************/
int DLL_EXP_IMP WINAPI Clock_Show_Hide(BOOL bShowHide)
{
    HWND    hWnd;

    hWnd = GetDlgItem(FindWindow(TASKBAR, NULL), ID_TRAY);
 hWnd = GetDlgItem(hWnd, ID_CLOCK);
    if (hWnd == NULL)
        return 0;

    ShowWindow(hWnd, bShowHide ? SW_SHOW : SW_HIDE);
    UpdateWindow(hWnd);

    return 1;
}


/************************************************************
 * Enable/Disable special keys.                             *
 * (Ctrl+Alt+Del, Alt+Tab, Alt+Esc, Ctrl+Esc, Win key, ...) *
 * TRUE=Enable, FALSE=Disable                               *
 * (Win 9x)                                                 *
 ************************************************************/
int DLL_EXP_IMP  WINAPI Keys_Enable_Disable(BOOL bEnableDisable)
{
    BOOL    bOldState;

    return SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, bEnableDisable ? FALSE : TRUE, &bOldState, 0);
}


/************************************
 * Enable/Disable Alt+Tab, Alt+Esc. *
 * TRUE=Enable, FALSE=Disable       *
 * ( Win ?)                         *
 ************************************/
int DLL_EXP_IMP WINAPI AltTab1_Enable_Disable(BOOL bEnableDisable)
{
    BOOL    bOldState;

    return SystemParametersInfo(SPI_SETFASTTASKSWITCH, bEnableDisable ? FALSE : TRUE, &bOldState, 0);
}


/************************************
 * Enable/Disable Alt+Tab, Alt+Esc. *
 * TRUE=Enable, FALSE=Disable       *
 * (Win 2K)                         *
 ************************************/
int DLL_EXP_IMP WINAPI AltTab2_Enable_Disable(HWND hWnd, BOOL bEnableDisable)
{
    #define m_nHotKeyID 100

    if (!bEnableDisable)
 {
  if (!RegisterHotKey(hWnd, m_nHotKeyID+0, MOD_ALT, VK_TAB))  // Alt+Tab
   return 0;
        if (!RegisterHotKey(hWnd, m_nHotKeyID+1, MOD_ALT, VK_ESCAPE)) // Alt+Esc
   return 0;
    }
 else
 {
        if (!UnregisterHotKey(hWnd, m_nHotKeyID+0))
   return 0;
        if (!UnregisterHotKey(hWnd, m_nHotKeyID+1))
   return 0;
 }
 return 1;
}


/**************************************
 * Low Level Keyboard Hook procedure. *
 * (Win NT4SP3+)                      *
 **************************************/

HHOOK hKeyboardHook;  // Old low level keyboard hook

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p;

    if (nCode == HC_ACTION)
    {
        p = (PKBDLLHOOKSTRUCT) lParam;

        if (
            // WIN key (for Start Menu)
            ((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)) ||      
            // ALT+TAB
            (p->vkCode == VK_TAB && p->flags & LLKHF_ALTDOWN) ||      
            // ALT+ESC
            (p->vkCode == VK_ESCAPE && p->flags & LLKHF_ALTDOWN) ||   
            // CTRL+ESC
            ((p->vkCode == VK_ESCAPE) && ((GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0)) ||
            // CTRL+SHIFT+ESC
            ((p->vkCode == VK_ESCAPE) && ((GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0) && ((GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0)) ||
   // CTRL+ALT+DEL (Unfortunately doesn't work !)
            ((p->vkCode == VK_DELETE) && ( (p->flags & LLKHF_ALTDOWN) != 0 ) && ( (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0))
            )
            return 1;
   }
                   
   return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}


/*****************************************************
 * Enable/Disable task switching keys.               *
 * (Alt+Tab, Alt+Esc, Ctrl+Esc, Win, Ctrl+Shift+Esc) *
 * TRUE=Enable, FALSE=Disable                        *
 * (Win NT4SP3+, Win2K).                             *
 *****************************************************/
int DLL_EXP_IMP WINAPI TaskSwitching_Enable_Disable(BOOL bEnableDisable)
{
    if (!bEnableDisable)
    {
        if (!hKeyboardHook)
  {
            // Install the low-level keyboard hook
            hKeyboardHook  = SetWindowsHookEx(WH_KEYBOARD_LL,
                                              LowLevelKeyboardProc,
                                              hInst,
                                              0);
   if (!hKeyboardHook)
    return 0;
  }
    }
    else
    {
        UnhookWindowsHookEx(hKeyboardHook);
        hKeyboardHook = NULL;
    }

    return 1;
}


/****************************************
 * Disable Task Manager (CTRL+ALT+DEL). *
 * TRUE=Enable, FALSE=Disable           *
 * (Win NT/2K/XP)                       *
 ****************************************/
int DLL_EXP_IMP WINAPI TaskManager_Enable_Disable(BOOL bEnableDisable)
{
    #define KEY_DISABLETASKMGR  "Software//Microsoft//Windows//CurrentVersion//Policies//System"
    #define VAL_DISABLETASKMGR  "DisableTaskMgr"

    HKEY    hKey;
    DWORD   val;
 LONG r;

    if (RegOpenKey(HKEY_CURRENT_USER, KEY_DISABLETASKMGR, &hKey) != ERROR_SUCCESS)
        if (RegCreateKey(HKEY_CURRENT_USER, KEY_DISABLETASKMGR, &hKey) != ERROR_SUCCESS)
   return 0;

    if (bEnableDisable) // Enable
    {
        r = RegDeleteValue(hKey, VAL_DISABLETASKMGR);
    }
    else                // Disable
    {
        val = 1;
        r = RegSetValueEx(hKey, VAL_DISABLETASKMGR, 0, REG_DWORD, (BYTE *)&val, sizeof(val));
    }

    RegCloseKey(hKey);

    return (r == ERROR_SUCCESS ? 1 : 0);
}


/*****************************************************************
 * Enable/Disable Ctrl+Alt+Del and Ctrl+Shift+Esc key sequences. *
 * TRUE=Enable, FALSE=Disable                                    *
 * (Win 2K).                                                     *
 *****************************************************************/
int DLL_EXP_IMP WINAPI CtrlAltDel_Enable_Disable(BOOL bEnableDisable)
{
 static BOOL bInjected = FALSE;

    if (!bEnableDisable)
    {
  if (!bInjected)
  {
   bInjected = Inject();
   return bInjected;
  }
    }
    else
    {
  if (bInjected)
  {
   bInjected = !Eject();
   return !bInjected;
  }
    }

    return 0;
}


/******************************
 * Create and start a thread. *
 ******************************/
BOOL StartThread(LPTHREAD_START_ROUTINE ThreadFunc, THREAD_DATA *td)
{
 ULONG tid;
 HANDLE hThread;

 // Create and start thread
 hThread = CreateThread(NULL,
         0,
         ThreadFunc,
         td,
         0,
         &tid);

 if (!hThread)
  return FALSE;

 // Wait until thread terminates
 WaitForSingleObject(hThread, INFINITE);

 CloseHandle(hThread);

 return TRUE;

}


/************************************************
 * Create a new Desktop and run a Thread in it. *
 * (Win NT+).                                   *
 ************************************************/
int DLL_EXP_IMP WINAPI Thread_Desktop(LPTHREAD_START_ROUTINE ThreadFunc, THREAD_DATA *td)
{
 HDESK hOriginalThread;
 HDESK hOriginalInput;
 HDESK hNewDesktop;

 // Save original ...
 hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
 hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);

 // Create a new Desktop and switch to it
 hNewDesktop = CreateDesktop(td->szDesktopName, NULL, NULL, 0, GENERIC_ALL, NULL);
 SetThreadDesktop(hNewDesktop);
 SwitchDesktop(hNewDesktop);

 // Execute thread in new desktop
 td->hDesk = hNewDesktop;
 StartThread(ThreadFunc, td);

 // Restore original ...
 SwitchDesktop(hOriginalInput);
 SetThreadDesktop(hOriginalThread);

 // Close the Desktop
 CloseDesktop(hNewDesktop);

 return 0;
}

 

/****************
 * Run process. *
 ****************/
BOOL StartProcess(char *szDesktopName, char *szPath)
{
    STARTUPINFO         si;
    PROCESS_INFORMATION pi;

    // Zero these structs
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
 si.lpTitle = szDesktopName;
 si.lpDesktop = szDesktopName;
    ZeroMemory(&pi, sizeof(pi));

    // Start the child process
    if (!CreateProcess(NULL,    // No module name (use command line).
                       szPath,  // Command line.
                       NULL,    // Process handle not inheritable.
                       NULL,    // Thread handle not inheritable.
                       FALSE,   // Set handle inheritance to FALSE.
                       0,       // No creation flags.
                       NULL,    // Use parent's environment block.
                       NULL,    // Use parent's starting directory.
                       &si,     // Pointer to STARTUPINFO structure.
                       &pi))    // Pointer to PROCESS_INFORMATION structure.
    {
        return FALSE;
    }

 // Wait until process exits
 WaitForSingleObject(pi.hProcess, INFINITE);

    // Close process and thread handles
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

 return TRUE;
}


/*************************************************
 * Create a new Desktop and run a Process in it. *
 * (Win NT+).                                    *
 *************************************************/
int DLL_EXP_IMP WINAPI Process_Desktop(char *szDesktopName, char *szPath)
{
 HDESK hOriginalThread;
 HDESK hOriginalInput;
 HDESK hNewDesktop;

 // Save original ...
 hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
 hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);

 // Create a new Desktop and switch to it
 hNewDesktop = CreateDesktop(szDesktopName, NULL, NULL, 0, GENERIC_ALL, NULL);
 SetThreadDesktop(hNewDesktop);
 SwitchDesktop(hNewDesktop);

 // Execute process in new desktop
 StartProcess(szDesktopName, szPath);

 // Restore original ...
 SwitchDesktop(hOriginalInput);
 SetThreadDesktop(hOriginalThread);

 // Close the Desktop
 CloseDesktop(hNewDesktop);

 return 0;
}


/************************
 * Library entry point. *
 ************************/
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpReserved)
{
    hInst = hInstDll;

 return TRUE;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值