[英]Delphi application - Block windows-key (Start) on Windows 8
我正在编写一个Delphi应用程序。 我的目标是用我的应用程序覆盖“所有”屏幕,以强制用户填写我的表格。 应用程序将按计划任务运行。
我的问题是,通常Windows不允许应用程序阻止其他用户的操作。
在Windows 7中,我可以将应用程序作为scr文件(屏幕保护程序)运行,没有标题栏,并设置StayOnTop
。 在这种情况下,即使在“窗口键”(开始)上可见,其他应用程序也停留在我的应用程序后面,因此可以达到我的目标。 不幸的是,在Windows 8中,此解决方案不起作用,因为“窗口键”显示启动屏幕,此时我可以运行任何内容,而“任何内容”都位于最上面。
我用下面的代码尝试了一些技巧,但没有成功。
h := FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button',nil);
ShowWindow(h,0);
Windows.SetParent(h,0);
如何在整个Windows 8系统中阻止“窗口键”(开始按钮)操作?
我没有在Windows 8上对其进行测试,但原则上可以使用键盘挂钩来放弃按键。
类似于以下内容:
const
WH_KEYBOARD_LL = 13;
LLKHF_ALTDOWN = $00000020;
LLKHF_INJECTED = $00000010;
type
tagKBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
LPKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
var
hhkLowLevelKybd: HHOOK;
function LowLevelKeyBoardProc(nCode: Integer; awParam: WPARAM; alParam: LPARAM): LRESULT; stdcall;
var
fEatKeyStroke: Boolean;
p: PKBDLLHOOKSTRUCT;
begin
fEatKeystroke := False;
if active and( nCode = HC_ACTION) then
begin
case awParam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
begin
p := PKBDLLHOOKSTRUCT(alParam);
if DisableWinKeys then
begin
if p^.vkCode = VK_LWIN
then fEatKeystroke := True;
if p^.vkCode = VK_RWIN
then fEatKeystroke := True;
end;
end;
end;
end;
if fEatKeyStroke then
Result := 1
else
Result := CallNextHookEx(hhkLowLevelKybd, nCode, awParam, alParam);
end;
procedure InstallHook;
begin
if hhkLowLevelKybd <> 0 then exit;
hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
end;
procedure UninstallHook;
begin
if hhkLowLevelKybd = 0 then exit;
UnhookWindowsHookEx(hhkLowLevelKybd);
hhkLowLevelKybd := 0;
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.