>

나는 델파이 응용 프로그램을 프로그래밍하고 있습니다. 내 목표는 모든 화면을 내 응용 프로그램으로 덮어 사용자가 내 양식을 작성하도록하는 것입니다. 예약 된 작업으로 응용 프로그램이 실행됩니다.

내 문제는 일반적으로 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 시스템에서 '창 키'(시작 버튼) 동작을 차단하는 방법은 무엇입니까?


  • 답변 # 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;
    
    

관련 자료

  • 이전 SQL Server에서 총 백분율로 그룹화
  • 다음 shopify의 고객 등록 페이지에서 사용자 정의 필드를 추가하는 방법은 무엇입니까?