【问题标题】:Delphi application - Block windows-key (Start) on Windows 8Delphi 应用程序 - 在 Windows 8 上阻止 Windows 键(开始)
【发布时间】:2013-12-18 19:16:51
【问题描述】:

我正在编写一个 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 系统中阻止“窗口键”(开始按钮)动作?

【问题讨论】:

  • 您可以查看将 explorer.exe shell 替换为您的应用程序。这非常适合创建一个完全独立的应用程序。我已经通过重新编程我的应用程序以在关闭时执行 explorer.exe 来做到这一点。
  • 是的,我知道...我也曾经使用过这个解决方案,当时某个工作站上唯一允许的应用程序是我的。在这种情况下我不能使用它,但还是谢谢你:)

标签: windows delphi windows-8 screen


【解决方案1】:

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

【讨论】:

  • @CodeInChaos...你就是那个男人!即使在 Windows 8 中,您的代码也无需更改即可工作。我会投票支持您的解决方案,但我没有足够的声誉:(
  • 非常好 - 经过一些小修正后,代码仍然适用于 Windows 10(删除“活动”和“如果 DisableWinKeys then”行。干得好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多