使用RegHotKey设置全局快捷键,常规状态可以成功响应,但在电脑被锁定(rundll32.exe user32.dll,LockWorkStation)时,快捷键就不能够响应,我就是因为很多时候需要锁定电脑,防止任何人使用电脑,但这时媒体播放软件设置的快捷键不能响应(老板键),而想自己做一个可以替换媒体播放软件设置的快捷键,这样电脑播放媒体时,如果老板来了,而电脑也处于锁定状态,仍然可以轻松应付。

解决方案 »

  1.   

    建议你去看一下如何屏蔽Ctrl + Alt + Del 三键的文章,实现方法和这差不多.我只到的也只有这个方法.就是要截取Winlogon 的消息.
      

  2.   

    据说以下代码可以屏蔽Ctrl + Alt + Del,原理是利用:API hook,把进程注入winlogon.exe,然后把WlxLoggedOnSAS函数的地址修改为自己的函数入口(在XP下无法使用的),但我不知道怎样运行这个DLL,是在注册表中设置启动项就可以了,还是必须再做一个调用的程序(这样就很不爽)。谁能告诉我怎样调用以下代码吗?library insertdll;
    uses
     Windows,
     Messages,
     SysUtils;{$R *.RES}type
     TCode5 = packed record
       siJmp : ShortInt;
       dwAddr : DWORD;
     end;
     TThunkFunc = (tfWlxLoggedOnSAS);
     TThunkFuncName = packed record
       strMod        : string;  // 系统模块名称
       strSysProc    : string;  // 系统DLL中的名字
       strThunkProc  : string;  // 你替换的函数的名字,必须在DLL的引出表中
     end;
     TThunkCode = packed record
       codeBak       : TCode5;  // 系统函数的代码的前5个字节
       codeThunk     : TCode5;  // 跳转到你的代码的5个字节
       addr_sys      : Pointer; // 系统函数的地址
       addr_thunk    : Pointer; // 替换函数的地址
       bInstalled    : boolean; // 安装了吗?
     end;const
     ThunkFuncNameArr : array[TThunkFunc] of TThunkFuncName = (
       (strMod : 'msgina.dll';  strSysProc : 'WlxLoggedOnSAS';    strThunkProc : 'GanLoggedOnSAS')
     );
    var
     ThunkCodeArr : array[TThunkFunc] of TThunkCode;
     hProc : THandle;procedure InitThunkCode;
    var
     tfType : TThunkFunc;
     hMod : HMODULE;
     pSysFunc, pThunkFunc : Pointer;
    begin
     for tfType := LOW(TThunkFunc) to HIGH(TThunkFunc) do begin
       // clear to zero
       FillChar(ThunkCodeArr[tfType], sizeof(TThunkCode), 0);   // fill it by right value
       hMod := 0;
       hMod := GetModuleHandle(PChar(ThunkFuncNameArr[tfType].strMod));
       if hMod = 0 then continue;   pSysFunc := nil;
       pSysFunc := GetProcAddress(hMod,
         PChar(ThunkFuncNameArr[tfType].strSysProc));
       if pSysFunc = nil then continue;   pThunkFunc := nil;
       pThunkFunc := GetProcAddress(hInstance,
         PChar(ThunkFuncNameArr[tfType].strThunkProc));
       if pThunkFunc = nil then continue;   // now fill it!
       ThunkCodeArr[tfType].addr_sys := pSysFunc;
       ThunkCodeArr[tfType].addr_thunk := pThunkFunc;   ThunkCodeArr[tfType].codeThunk.siJmp := ShortInt($E9);  // jmp ____
       ThunkCodeArr[tfType].codeThunk.dwAddr :=
         DWORD(pThunkFunc) - DWORD(pSysFunc) - 5;   ThunkCodeArr[tfType].codeBak.siJmp := PByte(pSysFunc)^;
       ThunkCodeArr[tfType].codeBak.dwAddr := PDWORD(DWORD(pSysFunc)+1)^;
     end;
    end;procedure InstallThunkFunc(tfType : TThunkFunc);
    var
     nCount : DWORD;
    begin
     if ThunkCodeArr[tfType].bInstalled then exit;
     if (hProc=0) or (ThunkCodeArr[tfType].addr_sys=nil) then exit;
     WriteProcessMemory(hProc,
                        ThunkCodeArr[tfType].addr_sys,
                        @(ThunkCodeArr[tfType].codeThunk),
                        5,
                        nCount);
     ThunkCodeArr[tfType].bInstalled := True;
    end;procedure UnInstallThunkFunc(tfType : TThunkFunc);
    var
     nCount : DWORD;
    begin
     if not ThunkCodeArr[tfType].bInstalled then exit;
     if (hProc=0) or (ThunkCodeArr[tfType].addr_sys=nil) then exit;
     WriteProcessMemory(hProc,
                        ThunkCodeArr[tfType].addr_sys,
                        @(ThunkCodeArr[tfType].codeBak),
                        5,
                        nCount);
     ThunkCodeArr[tfType].bInstalled := false;
    end;const
     WLX_SAS_ACTION_NONE = 2;function GanLoggedOnSAS(pWlxContext:pointer;
                 dwSasType : DWORD;
                 pReserved : Pointer):Integer;stdcall;
    begin
     result := WLX_SAS_ACTION_NONE;
    end;var
     hThreadHandle : THANDLE;procedure DllMain(dwReason : DWORD);
    var
     dwThreadID : DWORD;
    begin
     case dwReason of
       DLL_PROCESS_ATTACH :
         begin
           InitThunkCode;
           InstallThunkFunc(tfWlxLoggedOnSAS);
         end;
       DLL_PROCESS_DETACH :
         begin
           UninstallThunkFunc(tfWlxLoggedOnSAS);
           CloseHandle(hProc);
         end;
       DLL_THREAD_ATTACH :
         begin
         end;
       DLL_THREAD_DETACH :
         begin
         end;
     end;
    end;exports
     GanLoggedOnSAS;begin
     DLLProc := @DLLMain;
     hProc := OpenProcess(PROCESS_ALL_ACCESS,
                          FALSE,
                          GetCurrentProcessID());
     DLLMain(DLL_PROCESS_ATTACH);
    end.
      

  3.   

    谁能告诉怎样使用上面“library insertdll”的代码吗?