Blokowanie wybranego przycisku z klawiatury Windows

0

Witam. W jaki sposób mogę zablokować przycisk/wysłanie wiadomości do systemu po naciśnięciu wybranego klawisza i odblokowanie go po wykonaniu np. funkcji. I czy jest możliwość aby funkcja do sprawdzania klawiszy GetKeyState działała normalnie ?

1

RegisterHotKey/UnregisterHotKey ? Tylko że to działa globalnie

1
sewek14 napisał(a):

Witam. W jaki sposób mogę zablokować przycisk/wysłanie wiadomości do systemu po naciśnięciu wybranego klawisza i odblokowanie go po wykonaniu np. funkcji. I czy jest możliwość aby funkcja do sprawdzania klawiszy GetKeyState działała normalnie ?

We własnej apliakcji?
każde okno ma główną pętlę, która może filtrować wciskane klawisze, zanim je dostaną np kontrolki edycyjne
ALE są liczne niuanse, i ja lubię zakazane znaki wklejać w clibboardu (w 2/3 przyadków programista o tym nie pomyślał)

O jakim środowisku naprawdę myslisz, bo jak na razie rozwijamy talenty do jasnowidzenia i zgadujemy.
Consola znakowa Windows?
Apka GUI - w jakim frameworku ?
Właściwie co masz na myśli "zablokować przycisk/wysłanie wiadomości do systemu" ? To znaczy wszystko, czyli nic.

2

domyślam się że chodzi o global keyboard hooka https://stackoverflow.com/questions/29734263/creating-global-keyboard-hook - w ten sposób możesz zablokować komunikaty, ale nie zablokujesz niektórych gier które komunikują się z klawiaturą w bardziej bezpośredni sposób

sewek14 napisał(a):

Witam. W jaki sposób mogę zablokować przycisk/wysłanie wiadomości do systemu po naciśnięciu wybranego klawisza i odblokowanie go po wykonaniu np. funkcji. I czy jest możliwość aby funkcja do sprawdzania klawiszy GetKeyState działała normalnie ?

tu nie wiem o co chodzi, ale też podejrzewam że o to że niektóre klawisze poza trybem wciśnięty wyciśnięty 1 / 0 mają tryb przełączony (np scroll lock, insert itp) - 8000. Mogą być też wciśnięte przełączone i wciśnięte nieprzełączone. Jak przeczytasz dokumentację to pewnie zacznie działać normalnie

0

Właśnie chodzi o to, aby po odpaleniu aplikacji blokowało wciśniecie klawisza w grze. Spróbuję w wolnej chwili z tym Globalnym Hookiem. Są jeszcze jakieś inne sposoby ?

0
sewek14 napisał(a):

Właśnie chodzi o to, aby po odpaleniu aplikacji blokowało wciśniecie klawisza w grze. Spróbuję w wolnej chwili z tym Globalnym Hookiem. Są jeszcze jakieś inne sposoby ?

global hook to chyba najniżej jak się da wpiąć, później już zostaje chyba tylko sterownik klawiatury
Jeśli chodzi o blokadę klawisza windows żeby nie przeszkadzał to prawie każda klawiatura gamingowa ma przycisk "windows lock".

Możesz przejrzeć źródła AutoHotKey https://github.com/Lexikos/AutoHotkey_L - jest napisany w C++ i pozwala na tworzenie makr i przemapowanie przycisków klawiatury, ale z tego co wiem nie działa wszędzie (na przykład na pulpicie zdalnym) więc pewnie też korzysta z global hooka

1

global hook to chyba najniżej jak się da wpiąć, później już zostaje chyba tylko sterownik klawiatury

Zanim dojdziemy do sterownika urządzenia to po drodze jest jeszcze układ klawiatury (keyboard layout), odpowiadający za to czy mamy qwerty, azerty, polskie litery czy niemieckie itp.
Układ wybieramy z dostępnych w systemie, ale można zdefiniować też własny za pomocą MSKLC (Microsoft Keyboard Layout Creator).
Można przedefiniować tam klawisze alfanumeryczne, ale z tego co pamiętam to nie specjalne.

Jeszcze niżej, ale wciąż ponad sterownikiem, jest (albo była) możliwość przemapowania scancode'ów klawiatury w rejestrze. Jest mało o tym informacji w necie (szukać pod Scancode Map). Kiedyś użyłem tego pod XP i nie jestem pewien czy wciąż ten sposób działa w Win10 czy 11.

No i jeśli mamy programowalną klawiaturę to odpowiednim dla niej toolem możemy robić co chcemy (i co się da). To jest sposób specyficzny dla danej klawiatury, a nie dla wszystkich klawiatur podłączonych do komputera (co może być denerwujące – możemy przecież chcieć przemapować coś na klawiaturze laptopa, ale nie na podłączonej zewnętrznej, albo odwrotnie).

0

Witam. Niestety przez global hooka nie dało rady zablokować :/ Muszę się pogodzić z tym, że nie da rady


LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    BOOL fEatKeystroke = FALSE;

    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
        case WM_KEYDOWN:
        case WM_SYSKEYDOWN:
        case WM_KEYUP:
        case WM_SYSKEYUP:
            PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
            if (fEatKeystroke = (p->vkCode == 0x41))
              break;
        }
    }
    return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

int main()
{
    HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);

    MSG msg;
    while (!GetMessage(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hhkLowLevelKybd);

    return(0);
}

0

w Delphi zablokowałem F3 , napisał bym to w c++ ale uzywam Qt wiec trochę niekompatybilne :D
generalnie chodzi o idee

unit Unit18;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm18 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form18: TForm18;

implementation

{$R *.dfm}

const
  HOTKEY_ID = 3145926;


procedure TForm18.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle,HOTKEY_ID , 0, VK_F3); // F3
end;

procedure TForm18.WMHotKey(var Msg: TWMHotKey);
begin
  // This procedure is called when a window message WM_HOTKEY
  inherited;  // We give the form to process the message,
               // if she already has its handler
  if Msg.HotKey =  HOTKEY_ID then
  begin
    Caption := DateToStr(now());
  end;

end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1