Wykrywanie wciśnięcia klawisza, gdy Forma nie jest aktywna

0

Na wstępie przepraszam, że odnawiam ten temat, ale nie została dostarczona odpowiedź w poprzednim, a tamten uległ jakby przedawnieniu.

Chcę zrobić "trainera" do gry, i chcę, by podczas działania aktywnej aplikacji gry po wciśnięciu jakiegoś klawisza zadziałała jakaś procedura (np symulacja wciśnięcia kilku klwiszy)

OnKeyPress odpada, bo gdy aplikacja "trainera" nie jest aktywna, to nie działa. jest możliwość, żeby kod się wpisywał za pomocą Timer'a ale chciałbym, by było to kontrolowane zjawisko.

0

hook na klawiaturę + szukaj. Było wiele razy.

0

Właśnie znalazłem w <url=http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_5#id-'Zahaczanie'-okien>Kompendium - zahaczanie</url> ale jest tam baardzo dużo rzeczy i łatwo dostać epilepsji :P W załączonych programach interesujący mnie jeden program w ogóle nie reaguje (KeyHook) a działający program (API) jest zbudowany tak, że w ogóle tego nie rozumiem i nie wiem jak tego użyć.

Ale znalazłem cosik takiego:

private 
procedure WMHotKey(var Msg : TMessage); message WM_HOTKEY; 


-------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle,$0001,0,VK_SNAPSHOT);
RegisterHotKey(Handle,$0002,0,ord('9'));
//dalsza lista ...
end;

procedure TForm1.WMHotKey(var Msg: TMessage);
begin
if Msg.wParam=$0001 then
begin
// co sie dzieje po wciscnieciu klawisza Printscreen
end;
if Msg.wParam=$0002 then
begin
// co sie dzieje po wciscnieciu klawisza 9 (nie w nmpadzie)
end;

end; 

Co pozwala w prościutki sposób wyczaić wciśnięcie klawisza Printscreen (VK_SNAPSHOT) i innych np Dziewiątki (tej z otworzeniem nawiasu). Działa także po zminimalizowaniu.

0

Ja się zastanawiam jak skonwertować oznaczenie klawisza.
Wiem że w WORD klawisz który chce użyć ma numer 177.

Jak przekonwertować go by pasował tutaj:

RegisterHotKey(Handle,$0001,0, ?177? );
1

Kod klawisza musi być zgodny z tym opisanym na liście: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx - w Twoim przypadku jest to VK_MEDIA_PREV_TRACK czyli multimedialny klawisz poprzedniej ścieżki. Jednak taki HotKey jak chcesz ustawić nie zadziała globalnie ani pod DOSBoxem ani pod wieloma grami DitectX gdy ta będzie na pierwszym planie.

W tym celu by działał na prawdę globalnie, polecam kod modułu hotkeyhandler2_ver2.pas z kodu źródlowego trainera - dostępnego do pobrania pod koniec wpisu na moim Blogu - pod adresem: http://blog.olesio.eu/analiza-max-payne-patch-v1-05-w-celu-stworzenia-trainera bazuje on na fragmencie kodu ze starszej wersji programu Cheat Engine. W przypadku tego trainera zaadaptowany do WinAPI. Polecam go używać, ponieważ sprawdza w wątku naciskane klawisze bez konieczności używania globalnego Hooka na klawiaturę. Jednak wiem z forum XMPlay'a gdzie użyłem go w pluginie do obsługi klawiszy multimedialnych, że niektórym nie działał ok. Ale od czego to zależy nie mam do końca pojęcia. Poniżej przykład prostego kodu, który zadziała tylko gdy naciskamy go w typowych aplikacjach okienkowych, a nie pełno ekranowych grach DX.

//...
type
  TForm1 = class(TForm)
    Button1 : TButton;
    procedure FormClose(Sender : TObject; var Action : TCloseAction);
    procedure FormCreate(Sender : TObject);
  private
    OrigMainFormWndProc : TWndMethod;
    procedure MainFormWindowProc(var AMessage : TMessage);
  public
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.MainFormWindowProc(var AMessage : TMessage);
begin
  with AMessage do
  begin
    case Msg of
      WM_HOTKEY :
        begin
          case WParam of
            1 :
              begin
                ShowMessage('Boom');
              end;
          end;
        end;
    end;
    OrigMainFormWndProc(AMessage);
  end;
end;

procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  Self.WindowProc := OrigMainFormWndProc;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  OrigMainFormWndProc := Self.WndProc;
  Self.WindowProc := MainFormWindowProc;
  Windows.RegisterHotKey(Self.Handle, 1, 0, 177);
end;

//...

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