使用RegHotKey设置全局快捷键,常规状态可以成功响应,但在电脑被锁定(rundll32.exe user32.dll,LockWorkStation)时,快捷键就不能够响应,我就是因为很多时候需要锁定电脑,防止任何人使用电脑,但这时媒体播放软件设置的快捷键不能响应(老板键),而想自己做一个可以替换媒体播放软件设置的快捷键,这样电脑播放媒体时,如果老板来了,而电脑也处于锁定状态,仍然可以轻松应付。
解决方案 »
- DevExpress Ribbon如何屏蔽customize quick access toolbar和recent documents
- DELPHI中如何翻页
- 怎样判断与SQL数据库连接是否断线
- dbgrideh中怎样显示数据库当中没有的字段
- 500分!!急——怎么样把全屏的游戏窗体设置成为自己程序的父窗体
- 超难查询语句,,,这样的记录查询如何写查询语句/.....
- 在DELPHI中如何调用SQL SERVER中的存储过程?
- 关于文件夹操作
- ado和表格连接的问题!!!!!!
- 请教Delphi方面的专家,
- 求代码或者有源控件关于按钮按下后可保留按下时的状态。可更改按钮颜色。
- delphi中怎样用commit 和roolback来对数据进行保存
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.