2013-12-18 72 views
-1

我正在编写一个Delphi应用程序。我的目标是用我的应用程序覆盖所有屏幕,以强制用户填写我的表单。应用程序将按计划任务运行。Delphi应用程序 - 在Windows 8上禁止Windows键(启动)

我的问题是,通常情况下,Windows不允许应用程序阻止其他用户的操作。

在Windows 7中,我可以运行我的应用程序作为scr文件(屏幕保护程序),没有标题栏并设置StayOnTop。在这种情况下,其他应用程序即使在“窗口键”(开始)处可见,也会留在应用程序后面,因此我的目标已达到。 不幸的是,在Windows 8中,这个解决方案不起作用,因为“window key”显示开始屏幕,当我可以运行任何东西时,这个“任何东西”都保持在最前面。

我试了一下下面的代码,但没有成功。

h := FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button',nil); 
    ShowWindow(h,0); 
    Windows.SetParent(h,0); 

如何在整个Windows 8系统中阻止'window key'(启动按钮)动作?

+0

你可以看一下你的应用程序替换Explorer.exe的外壳。这非常适合创建完全独立的应用程序。我已经通过重新编程我的应用程序来执行此操作,以便在关闭时执行explorer.exe。 –

+0

是的,我知道......我曾经使用过这个解决方案,当时某些工作站上唯一允许的应用程序是我的。我不能在这种情况下使用它,但无论如何谢谢你:) –

回答

6

我没有在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; 
+2

@CodeInChaos ...你是男人!即使在Windows 8中,您的代码也不会发生变化。我会为您的解决方案投票,但我没有足够的信誉:( –

相关问题