problem z grubsza przedstawia sie tak: chce przepisac program napisany w delphi na C++ i troszke go przerobic na swoje potrzeby, niby wszystko powinno dzialac, skladnia poprawna, ale nic nie dziala :/, kombinowalem ze skladnia, kodem, przezucalem deklaracje z unit1.h do konstruktora formy, potem wszystko wzucilem do public w unit1.h(cale funkcje nawet), pytalem sie googli i helpa od buildera, i dalej nic, najwiecej problemow sprawia mi hook i funkcja ZrobKomunikat, czasem nawet uda sie skompilowac bez bledow, ale i tak program nie dziala :( problem jest chyba z kodem w zaleznosci gdzie sie znajduje sypie roznymi errorami (a to blad skladni, a to ze zmienna nie istnieje, a deklaracja jest linijke wyzej, czasem linker wyzuci error ze funkcja nie istnieje, jak probuje wywolac hook'a z dll (funkcja of cors zadeklarowana) rozne roznosci) prosze o rade
p.s. wiem ze mozna zasymulowac wcisniecia klawisza za pomoca SendInput i keyb_event, ale ja potrzebuje wzucic komunikat do kolejki systemowej, a to jest chyba jedyna metoda (cos na msdn pisza ze z pomoca wh_keyb_LL i keyb_event w procedurze obslugi tego hook'a mozna, ale to sciema jakas sprawdzalem i symulacja trafia prosto na wyjscie omija kolejke systemowa )
program ktory przepisuje
Na formie powinien być komponent TEdit i TButton
type
TKomunikatLista = class(TList)
public
destructor Destroy; override;
end;
var
KomIlosc: word ;
Hook:Integer;
Komunikat:TEventMsg;
KomunikatLista: TKomunikatLista ;
destructor TKomunikatLista.Destroy;
var
i: word;
begin
for i := 0 to Count-1 do
Dispose(PEventMsg(Items[i]));
inherited Destroy;
end;
procedure ZrobKomunikat(Klawisz: byte; Komun: Cardinal);
var
Kom: PEventMsg;
begin
New(Kom);
with Kom^ do begin
message := Komun;
paramL := Klawisz;
paramH := MapVirtualKey(Klawisz, 0);
time := GetTickCount;
hwnd := 0;
end;
KomunikatLista.Add(Kom);
end;
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
hc_Skip: begin
inc(KomIlosc);
if KomunikatLista.Count<=KomIlosc then begin
UnhookWindowsHookEx(Hook);
KomunikatLista.Free; end
else
Komunikat := TEventMsg(KomunikatLista.Items[KomIlosc]^);
Result := 0;
end;
hc_GetNext: begin
PEventMsg(lParam)^ := Komunikat;
Result := 0
end
else
Result := CallNextHookEx(Hook, Code, wParam, lParam);
end;
end;
procedure Push(s:string);
var x:integer;
begin
KomunikatLista:=TKomunikatLista.Create;
for x:=1 to Length(s) do begin
ZrobKomunikat(vkKeyScan(s[x]), wm_KeyDown);
ZrobKomunikat(vkKeyScan(s[x]), wm_KeyUp);
KomIlosc := 0;
end;
Komunikat:=TEventMsg(KomunikatLista.Items[0]^);
Hook:=SetWindowsHookEx(wh_JournalPlayback, Play, hInstance, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.SetFocus;
Push('symulacja');
end;
a tu kod w bcb (najbardziej problematycznego jego czesci )
class TKomunikatLista: public TList {};
int KomIlosc;
HHOOK hookHandle;
HINSTANCE DllInstance;
TEventMsg *Komunikat;
TKomunikatLista *KomunikatLista;
void ZrobKomunikat (int Klawisz, int Komun)
{
typedef struct {
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
HWND hwnd;
} PEventMsg;
PEventMsg *Kom= new PEventMsg;
Kom->message=Komun;
Kom->paramL=Klawisz;
Kom->paramH=MapVirtualKey(Klawisz, 0);
Kom->time=GetTickCount();
Kom->hwnd=0;
KomunikatLista->Add(Kom);
}
LRESULT CALLBACK JournalPlaybackProc( int code, WPARAM wParam, LPARAM lParam )
{
switch (code)
{
case HC_SKIP: if (KomunikatLista->Count<=KomIlosc)
{
KomIlosc++;
UnhookWindowsHookEx(hookHandle);
KomunikatLista->Free();
}
else
{
Komunikat = (PEventMsg)KomunikatLista->Items[KomIlosc];
return 0;
}
case HC_GETNEXT:
PEventMsg(lParam)= Komunikat;
return 0 ;
}
return CallNextHookEx(hookHandle,code,wParam,lParam);
}
bool Push()
{
ZrobKomunikat('VK_1', WM_KEYDOWN);
ZrobKomunikat('VK_1', WM_KEYUP);
KomIlosc = 0;
Komunikat=(PEventMsg)KomunikatLista->Items[0];
hookHandle SetWindowsHookEx (WH_JOURNALPLAYBACK,JournalPlaybackProc,DllInstance,0);
return 0;
} ;