Gå til innhold

Bruke Prt Screen, Home, End osv som snarveitaster


Anbefalte innlegg

Akkurat som topic, hvordan kan jeg bruke Prt Screen, Home, End, Insert osv som snarveistaster?

 

For eksempel med Prt Screen.

Da kan jeg selvfølgelig bruke GetAsyncKeyState, men problemet med denne funksjonen er at den blir tatt for å være en keylogger...

 

procedure TForm1.Timer1Timer(Sender: TObject);
var
 result: string;
 i: byte;
begin

 for i := 8 To 222 do
   begin
      if GetAsyncKeyState(i)=-32767 then
       begin
       case i of
       44 : result := 'Prt Screen'; //44 er Prt Screen
end;

Når jeg prøver å kjøre denne koden, begyner Norton AntiVirus å gå helt berserk, og advarer gang på gang om en keylogger, og stopper operasjonen.

Så hvordan kan jeg gjøre dette uten å bli tatt for å være et virus?

Endret av @kd
Lenke til kommentar
Videoannonse
Annonse

Det scriptet er veldig normalt å bruke i keyloggers, så det er kanskje ikke så rart, men skal den tasten funke for ditt program, eller når som helst (til og med når programmet er minimert?).

Endret av chrml
Lenke til kommentar
Det scriptet er veldig normalt å bruke i keyloggers, så det er kanskje ikke så rart, men skal den tasten funke for ditt program, eller når som helst (til og med når programmet er minimert?).

Riktig, den skal funke når programmet er minimert også.

Det var derfor jeg bare kom på akkurat denne metoden, sliter fortsatt med at programmet mitt blir tatt for å være en keylogger... :(

Lenke til kommentar

Da blir det værre, for brukere vil aldri kunne stole på om programmet ditt faktisk er en keylogger, eller om den bare bruker dem som snarvei, etc..., og det er virkelig annoying om du skal publisere ett program som blir detecta som virus.

 

Du kan lage deler av programmet ditt som en device driver (akkurat som CloneCD gjør for full tilgang til CD/DVD brenneren). Da skulle det ikke være no problem å fange opp key events.

Lenke til kommentar

Jeg har alt annet en peiling på åssen man lager en device driver, men det skal visst være fullt mulig i Delphi (med DLL filer regner jeg med).

 

However, det å lage en device driver bare for å fange opp noen tastetrykk, er egentlig ganske bortkasta, så det må være en annen vei, som Norton ikke detecter som keylogger.

 

Det er virkelig synd at Norton detecter ett program som bruker en såpass enkel API som keylogger, men det er vel en vei rundt det.

Lenke til kommentar

Hva med å bruke OnKeyUp, er det ikke mye enklere?

 

Dette funker helt greit hos meg (jeg har NAV installert, den detekterer ingenting):

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 ShowMessageFmt('Key %d',[key]);
end;

 

Jeg får 44 fra PrintScreen, akkurat som du.

Lenke til kommentar

Bare pirking kanskje. Med snarveitaster forstår man ofte tastene som kaller funksjoner innenfor den aktive formen. Så min kode kan være nok i mange tilfeller (mange kaller dette KISS prinsip - keep it simple, stupid).

 

Som regel må du sette Form1.KeyPreview=True, hvis du har andre kontroller på formen som kan ha fokus, der har du rett.

Lenke til kommentar

Her er en snutt som funker selv om programmet er minimert eller ikke har fokus, tror ikke dette skal bli detected som virus

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    Label1: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private

    Procedure WMHotkey( Var msg: TWMHotkey ); message WM_HOTKEY;

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  If not RegisterHotkey( Handle, 1, 0, VK_SNAPSHOT ) Then

    ShowMessage('Kan ikke bruke "Print screen" som hotkey');

 

  If not RegisterHotkey( Handle, 2, 0, VK_HOME ) Then

    ShowMessage('Kan ikke bruke "Home" som hotkey');

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  UnRegisterHotkey( Handle, 1 );

  UnRegisterHotkey( Handle, 2 );

end;

 

procedure TForm1.WMHotkey( Var msg: TWMHotkey );

begin

  case msg.HotKey of

    1: label1.caption := 'Prt Screen';

    2: label1.caption := 'Home';

  end;

end;

end.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...