[C++ Builder XE] Kontrola Myszki i Klawiatury

0

Witam

Chciałbym sprawdzić w programie czy ktoś pisze na klawiaturze, rusza myszką.

Czego użyć do badania stanu klawiatury, myszki

Pozdrawiam

0

znaczy chcesz żeby przy ruszeniu klawiatury/myszy piskało coś, wyświetlało się czy o co chodzi?

0

Jeśli chodzi Ci o sprawdzenie czy coś się dzieje na kompie, ale nie ma znaczenia co to sprawdzasz "Idle state".
Do sprawdzenia myszki możesz skorzystać z WinAPI np. Sprawdzając pozycję co kilka milisekund.

Zawsze też możesz skorzystać z hooka globalnego, ale bardzo dużo programów wirusowych zacznie wykrywać wtedy Twój program jako wirus.

Powiedz co chcesz zrobić, a nie pytasz jak zrobić to co myśisz, że powinno się zrobić.

Jak chodzi Ci keyloggera to masz to: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644960%28v=vs.85%29.aspx
Jak chcesz sprawdzać to TYLKO w swoim programie to sprawdzasz zdarzenia w stylu: OnMouseMove, OnKeyDown itp..

0

Chce zrobić sobie program który będzie sprawdzał czy naciśnięto jakikolwiek klawisz, czy poruszano myszką.
Jeśli nikt nie ruszał myszki ani klawiatury to po 5 minutach komputer zostanie zablokowany. LockWorkStation();

Program będzie działał albo jako proces albo w tray-u.

0

czyli program ma z dużą częstotliwością próbkowania sprawdzać czy podejmujesz jakąkolwiek akcję myszą bądź klawiaturą i w zależności od tego podejmować dane działanie lub nie.

ja to widzę tak: kilkadziesiąt razy na sekundę sprawdza wciśnięcie/ruszenie/klik, a przy każdym sprawdzeniu zwiększa licznik o 1. jeśli zarejestruje zdarzenie myszy albo klawiatury to liczy od nowa, a jeśli nie to dochodzi do określonej wartości i wykonuje dalszą część programu polegającą na wysłaniu systemowi polecenia zablokowania stacji.

ale żeby było to mądre, musi mieć wiedzę czy stacja jest już zablokowana, na wypadek gdybyś zablokował ją ręcznie, albo gdyby tenże program już ją zablokował. i musi sam od nowa zacząć śledzić Twoje poczynania myszo-klawiaturowe gdy odblokujesz stację, czyli cały program będzie w nieskończonej pętli, żebyś nie musiał go od nowa uruchamiać.

0

No coś takiego jak opisałeś.

0

W timerze wywołuj funkcję GetLastInputInfo http://msdn.microsoft.com/en-us/library/windows/desktop/ms646302%28v=vs.85%29.aspx

EDIT:

Nie mam BCB ale w Delphi taki przykładowy programik może wyglądać tak (myślę że nie powinno być problemów z przetłumaczeniem na BCB):

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure WMWTSSessionChange(var Msg: TMessage); message WM_WTSSESSION_CHANGE;
    function GetSecondsIdle: DWORD;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
  NOTIFY_FOR_THIS_SESSION = 0;
  NOTIFY_FOR_ALL_SESSIONS = 1;
  WTS_SESSION_LOCK = 7;
  WTS_SESSION_UNLOCK = 8;


  function WTSRegisterSessionNotification(hWnd: HWND; dwFlags: DWORD): BOOL; stdcall external 'Wtsapi32.dll';
  function WTSUnRegisterSessionNotification(hWnd: HWND): BOOL; stdcall external 'Wtsapi32.dll';

implementation

{$R *.dfm}

//obsluga komunikatu WM_WTSSESSION_CHANGE
procedure TForm1.WMWTSSessionChange(var Msg: TMessage);
begin
  case Msg.WParam of
    WTS_SESSION_LOCK: Timer1.Enabled:= False;
    WTS_SESSION_UNLOCK: Timer1.Enabled:= True;
  end;
end;

//zwraca czas bezczynnosci w sekundach
function TForm1.GetSecondsIdle: DWORD;
var
  liInfo: TLastInputInfo;
begin
  liInfo.cbSize:= SizeOf(TLastInputInfo);
  GetLastInputInfo(liInfo);
  Result:= (GetTickCount - liInfo.dwTime) div 1000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetSecondsIdle >= 300 then
  begin
    Timer1.Enabled:= False;
    LockWorkStation;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WTSRegisterSessionNotification(Handle, NOTIFY_FOR_THIS_SESSION);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  WTSUnRegisterSessionNotification(Handle);
end;

end.
0

W C++ jestem noga.

W Delphi beznadzieja.

Jak mogę skorzystać z WinApi w C++ builder.

Jakiś prosty przykład np wyświetlanie komunikatu.

0

Hej znalazłem tak kod

 void __fastcall TForm3::WndProc(Messages::TMessage &Message)
{
   if(Message.Msg==WM_MOUSEMOVE)
   {
	 ShowMessage("Myszka");
   }
   TWinControl::WndProc(Message);
}

Niestety działa tylko wtedy gdy najadę myszką na okno programu.
Jak przerobić ten kod aby działał na całym pulpicie a nie tylko na oknie.

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