Autor Téma: detekce stisku klávesy při neaktivnim okně  (Přečteno 971 krát)

Offline petouf

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
detekce stisku klávesy při neaktivnim okně
« kdy: 26-05-2023, 14:13:18 »
Ahoj, potřebuji trochu nakopnout. Rád bych vytvořil program, který monitoruje klávesnici a při každém jejím stisku (při zapnutém Caps) vytvoří zvukový signál. Tento program bych spouštěl v minimalizovaném okně po startu.
(občas se mi podaří psát se zapnutym CapsLockem, což neregistruji, protože při psaní čučím na klávesnici)
Problém je, že když okno minimalizuji, program na klávesy přestane reagovat. Používám událost OnKeyDown. Lze toto nějak vyřešit?
Díky za odpověď, přeji pěkný den...

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4.2, D11
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #1 kdy: 26-05-2023, 22:46:22 »
Na to by mohlo stačit periodicky (třeba přes TTimer) kontrolovat stav klávesy.
Kód: Delphi [Vybrat]
  1. uses Winapi.Windows, MMSystem;
  2.  
  3. procedure TForm1.Timer1Timer(Sender: TObject);
  4. begin
  5.   if GetKeyState(VK_CAPITAL) <> 0 then
  6.     PlaySound(PChar('SYSTEMASTERISK'), 0, SND_ASYNC); // nebo jen Beep; nebo cokoliv jineho
  7. end;
  8.  
nil

Offline petouf

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #2 kdy: 29-05-2023, 09:18:16 »
Ano, díky toto je skoro ono. Pípne to, když zmáčknu CapsLock. A já potřebuji aby to pípalo pokaždé, když se při aktivním capslocku zmáčkne nějaká klávesa. Zkoušel jsem to přes událost formuláře OnKeyDown, ale to fungovalo jen při aktivním okně.
Každopádně díky moc za starost. Pěkný den...

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 298
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #3 kdy: 29-05-2023, 13:31:49 »
To, co chceš, je v podstatě keylogger. S tím ti asi nikdo neporadí. Pokud chceš opravdu jen upozornit na stisk CapsLock (NumLock, ScollLock), přímo ve Windows 10 je v Nastavení - Usnadnění přístupu - Klávesnice - Použít funkci Ozvučení kláves. Zapni to a vyzkoušej.
Win10 Prof 64b, Firebird 2.5

Offline petouf

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #4 kdy: 29-05-2023, 16:09:17 »
Jasně, to znám. Ale při mé nepozornosti zapomenu, že to píplo a pak (po čase) si vesele píšu oBRÁCENĚ. Tak jsem myslel, že pokud by mě to píplo s každým stiskem klávesy, už by k tomu omylu nedocházelo. Ono to pak přepisovat je opruz :-/ Tak jsem si myslel, že bych si to takovýmhle "jednoduchým" prográmkem ošetřil. Nepotřebuji keylogger co zaznamenává co kdy bylo stisknuto, na tom mi nezáleží. Jenom, že byla stisknutá nějaká-jakákoli klávesa se zapnutým CapsLokem. A to jsem ještě nechtěl pípat přes zvukovku, ale vnitřním speakrem, to jsem pochopil, že nejde. Tak jsem su vytáhnul piezzo na COM port a chtěl jsem pískat takto :-D Vše jsem vyřešil a nykonec bude zakopanej psík v té detekci kláves. Nemáte nápad, jak to jinak udělat? Každopádně dík za nápady. :-)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7303
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #5 kdy: 29-05-2023, 16:45:40 »
Citace
Ono to pak přepisovat je opruz
Ak si taký zábudlivý, tak si môžeš čiastočne pomôcť Word-om. Vyskúšaj si, ako funguje výber + <SHIFT>+F3. Stláčaj ich opakovane najmenej 3x!
Ja síce pri písaní pozerám na monitor, takže to vidím. Ale občas "čumím" na klávesnicu. Kontrolku na CaspLock mám v strede pod medzerníkom. Takže ju vidím. Ale už som si vypestoval reflex na kontroly.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4.2, D11
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #6 kdy: 29-05-2023, 19:47:46 »
Good
Rated 1 time
Zůstal bych u toho timeru, vzhledem k tomu, že nepotřebuješ nutně odchytit 100% stisknutých kláves, ale stačí ti, když v nějakém rozumně krátkém intervalu (zkusil bych tak 500 ms) dostaneš upozornění na psaní se zapnutým Capslockem.

Kód: Delphi [Vybrat]
  1.  
  2. type
  3.   TForm1 = class(TForm)
  4.     Timer1: TTimer;
  5.     procedure Timer1Timer(Sender: TObject);
  6.   private
  7.     FPreviousKeyboardState: TKeyboardState;
  8.   public
  9.   end;
  10.  
  11. // ...
  12.  
  13. procedure TForm1.Timer1Timer(Sender: TObject);
  14. var
  15.   IsCapslockON: Boolean;
  16.   CurrentKeyboardState: TKeyboardState;
  17. begin
  18.   if GetKeyboardState(CurrentKeyboardState) then  // nacteni aktualniho stavu klavesnice
  19.   begin
  20.     IsCapslockON := CurrentKeyboardState[VK_CAPITAL] and 1 = 1;  // je Capslock zapnuty?
  21.     // pokud je Capslock zapnuty a je zjistena zmena jakekoliv klavesy, ozve se zvuk
  22.     if IsCapslockON and not CompareMem(@CurrentKeyboardState, @FPreviousKeyboardState, SizeOf(TKeyboardState)) then
  23.       Beep;
  24.     FPreviousKeyboardState := CurrentKeyboardState;  // zapamatovani aktualniho stavu klavesnice pro pristi pruchod
  25.   end;
  26. end;
  27.  
nil

Offline Otakar Milink

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #7 kdy: 30-05-2023, 11:41:03 »
A nebylo by lepší místo pípání ten CapsLock rovnou vypnout? :-)
https://www.makeuseof.com/windows-10-11-disable-caps-lock/


Offline petouf

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #8 kdy: 30-05-2023, 19:48:55 »
Díky, ale je to zase funkční jen při aktivním okně. Když PÍŠU TŘEBAS SEM tak to bohužel nereaguje. Potřeboval bych, aby ten prográmek běžel tiše někde v minimalizovaném okně a mě varoval před CapsLockem.
(Nechci ho úplně vypínat - i když je to taky zajímavý nápad - často ho právě používám a proto ho taky hodně zapomínám vypnout :-/)

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1528
  • Karma: 52
    • Verze Delphi: 11.3
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #9 kdy: 30-05-2023, 20:25:11 »

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4.2, D11
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #10 kdy: 30-05-2023, 21:52:51 »
Nevím přesně proč, ale když se zavolá GetKeyState(), aktualizuje se i buffer kláves, který vrací GetKeyboardState() a pak to funguje i v neaktivním okně. Takže třeba nějak takhle:
Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.     Timer1: TTimer;
  4.     procedure Timer1Timer(Sender: TObject);
  5.   private
  6.     FPreviousKeyboardState: TKeyboardState;
  7.   public
  8.   end;
  9.  
  10. // ...
  11.  
  12. procedure TForm1.Timer1Timer(Sender: TObject);
  13. var
  14.   IsCapslockON: Boolean;
  15.   CurrentKeyboardState: TKeyboardState;
  16. begin
  17.   if GetKeyboardState(CurrentKeyboardState) then  // nacteni aktualniho stavu klavesnice
  18.   begin
  19.     IsCapslockON := GetKeyState(VK_CAPITAL) and 1 = 1;  // je Capslock zapnuty?
  20.     // pokud je Capslock zapnuty a je zjistena zmena jakekoliv klavesy, ozve se zvuk
  21.     if IsCapslockON and not CompareMem(@CurrentKeyboardState, @FPreviousKeyboardState, SizeOf(TKeyboardState)) then
  22.       Beep;
  23.     FPreviousKeyboardState := CurrentKeyboardState;  // zapamatovani aktualniho stavu klavesnice pro pristi pruchod
  24.   end;
  25. end;
  26.  
nil

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 544
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:detekce stisku klávesy při neaktivnim okně
« Odpověď #11 kdy: 01-06-2023, 10:48:00 »
nastuduj funkciu "CallNextHookEx". Musi sa pouzit v dll kniznici, normalne v exaci je nefunkcna. Pouzivam, mam apku ktora mi odchytava veskere dianie na klavesnici a konkretne odchytavam napriklad dvojnasobne rychle stlacenie klavesy CTRL a v taky cas ju aktivujem do popredia inak je moja apka cely cas minimalizovana len v system tray