繁体   English   中英

Delphi应用程序-在Windows 8上阻止Windows键(开始)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM