powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / raw input инплемент для дельфи
21 сообщений из 21, страница 1 из 1
raw input инплемент для дельфи
    #37052566
Добрый день!

Вот оригинал темы ( http://www.sql.ru/forum/actualthread.aspx?tid=816629&hl=rawinput)
Требуется USB-штрихкод распознавать в программе. особенность - usb-штрихкод быстро лепит OnKeyDown события с задержкой 0.11 - 0.15мсек

Прошу подсказки где живет
RegisterRawInputDevices

предположительно живет RawInput_h.pas

Где раздобыть RawInput_h.pas?

Спасибо,
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37052612
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37052615
RENaissance
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав Демин, MSDN "говорит", что RegisterRawInputDevices находится в winuser.h (include windows.h)
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37052617
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно, сваять на основе rawinput.h
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37052908
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Дельфи еще с большей скоростью может обрабатывать эти коды.
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37052943
Anatoly PodgoretskyА Дельфи еще с большей скоростью может обрабатывать эти коды.
Поясните мысль?

Опыта с импортом из .H-файлов нет, потому остается поиск в поисковиках.
В соседней ветке выложен пример, но там опять не приложена библиотека, уже HidApiExport
( http://www.sql.ru/forum/actualthread.aspx?tid=693230&hl=%f8%f2%f0%e8%f5%ea%ee%e4)
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37052976
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем ты подчеркнул, что "быстро лепит OnKeyDown события"?
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053005
Anatoly PodgoretskyА зачем ты подчеркнул, что "быстро лепит OnKeyDown события"?
До данного штрихсканера склады работали на COM-штрихсканерах.
Новый усб-штрихсканер установился как доп. клавиатура, которая быстро генерирует OnKeyDown-события.
Первое решение было засекать время и если интервал слишком мал - тогда считать ввод со штрих-сканера (уже видел в соседних ветках, что можно настроить предикаты для сканера)
Но решение с rawinput считаю более технологичным.

По этой причине хочется рабочий пример с дальнейшим углублением в задачу.
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053055
Фотография demian111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав ДеминНовый усб-штрихсканер установился как доп. клавиатура

А документацию кто нить читал к сканеру?, может он все таки умеет COM порт эмулировать?
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053057
? http://code.google.com/p/cnpack/source/browse/trunk/cnvcl/Source/NonVisual/CnRawInput.pas
Ваша ссылка открылась в жутких крякозябрах.
Если у вас есть рабочий пример приложите, плз. (Похожую тему вы обсуждали в окт.2010)
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053200
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крякозябры только в начале, в комментариях, а сам модуль нормален.
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053340
Anatoly PodgoretskyКрякозябры только в начале, в комментариях, а сам модуль нормален.

отформатировал, пытаюсь компилировать.
ругается вот тут (из оригинала ссылки, стр 197-204)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
tagRAWINPUT =  record      
  header: RAWINPUTHEADER;     
   case  Integer  of        
     0 : (mouse: RAWMOUSE);       
     1 : (keyboard: RAWKEYBOARD);       
     2 : (hid: RAWHID);   
 end ;   
 {$EXTERNALSYM tagRAWINPUT}  
Для case явно не хватает end; добавляю end; - ругается
implementation expected, but ; found

В чем ошибка? (форматирование выше просмотрел - вроде аккуратно сделано)
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053356
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь, CnPack.inc у тебя есть тоже...
Попробуй удалить китайские комментарии (кракозябры) и сохранить в ASCII
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053358
Разобрался.

юнит назвал RawInput.pas и переменная внутри тоже RawInput
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053738
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Ярослав ДеминДля case явно не хватает end; добавляю end; - ругается
implementation expected, but ; found

В чем ошибка? (форматирование выше просмотрел - вроде аккуратно сделано)

Нет там ошибки, а вам самое время изучить язык в разделе вариантных записей. В хелпе "Delphi Language Reference" статья "Variant parts in records"

Потом скачайте целиком весь чина-пак в сырье (CnWizards_0.9.7.591 Source на текущий момент):
http://code.google.com/p/cnpack/downloads/list
Там есть и все исходники и нужные вам примеры.
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37053895
?[самое время изучить язык в разделе вариантных записей. В хелпе "Delphi Language Reference" статья "Variant parts in records"

СПасибо, за все годы работы вариантные записи остались невостребованы, а причина оказалась в одинаковом именовании названия юнита и переменной в тексте.
Вопросы еще остаются (вида:как вывести дружеские имена устройств, используется эта же технология для кей-логгеров и тд), но для быстрого решения задачи вашей ссылки оказалось достаточно, за что низкий поклон
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37055021
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав ДеминПервое решение было засекать время и если интервал слишком мал - тогда считать ввод со штрих-сканера (уже видел в соседних ветках, что можно настроить предикаты для сканера)
Но решение с rawinput считаю более технологичным.

А мне кажется, что нужно считывать код с TEdit. Я в своё время так и делал. Решение универсальное. Любой сканер можно подключить. Хоть PS/2, хоть USB. Держать постоянно активным TEdit или вообще у формы считывать. Раз в секунду проверять содержимое TEdit.Text.
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #37291917
Andrew Gupta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HidApiExport так и не нашел - пришлось заменить его.
Выкладываю проект HidTest для Delphi - может кому понадобиться.
Читает USB-порт с мышкой в мемо через Raw Input.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
raw input инплемент для дельфи
    #38340580
Dweeb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrew GuptaHidApiExport так и не нашел - пришлось заменить его.
Выкладываю проект HidTest для Delphi - может кому понадобиться.
Читает USB-порт с мышкой в мемо через Raw Input.

Где выложил? Откуда качать?
...
Рейтинг: 0 / 0
raw input инплемент для дельфи
    #38340600
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DweebAndrew GuptaHidApiExport так и не нашел - пришлось заменить его.
Выкладываю проект HidTest для Delphi - может кому понадобиться.
Читает USB-порт с мышкой в мемо через Raw Input.

Где выложил? Откуда качать?

Что ты некропостишь, гугль тебе в помощь:

https://www.google.ru/search?q=Delphi HID device&oq=Delphi HID device&aqs=chrome.0.69i57j0l2.3723j0&sourceid=chrome&ie=UTF-8
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
raw input инплемент для дельфи
    #39455205
Andrew Gupta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходники:

unit HidTest;
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
unit HidTest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, {HidApiExport, }StdCtrls, AppEvnts,
  HidUsage, uRawInput, ExtCtrls ;

type
  // Все необходимые структуры импортированы из MSDN
  TRawInputType = (RIM_TYPEMOUSE, RIM_TYPEKEYBOARD, RIM_TYPEHID); //Тип устройства

  TUsage = WORD;

  PRawInputDevice = ^TRawInputDevice;
{
  TRAWINPUTDEVICE = packed record
    usUsagePage : WORD;
    usUsage     : WORD;
    dwFlags     : DWORD;
    hwndTarget  : HWND;
  end;
}
  TRawInputDevice = record   // Дескриптор данных, на которые производится подписка
    UsagePage :TUsage;
    Usage :TUsage;
    Flags :DWord;
    Target :THandle;  //Окно, осуществляющее подписку
  end;

  TRawInputMouse = record
  usFlags :Word;
  ulButtons : DWord;
  ulRawButtons :DWord;
  lLastX : Longint;
  lLastY : Longint;
  ulExtraInformation : DWord;
 end;

 TRawInputKeys = record
  MakeCode :Word;
  Flags :Word;
  Reserved :Word;
  VKey :Word;
  Message :Word;
  ExtraInformation :DWord;
 end;

 TRawInputHID = record
  dwSizeHid :DWord;
  dwCount :DWord;
  bRawData :Pointer;
 end;

  TRawInputHeader = record //Заголовок пакета получаемых данных
    dwType :DWord;
    dwSize :DWord;
    hDevice :THandle;
    wParam :Longint;
  end;
  PRawInputHeader = ^TRawInputHeader;

  PRawInputRecord = ^TRawInputRecord;
  TRawInputRecord = record //Пакет с данными
    Header :TRawInputHeader;
    Case TRawInputType of
      RIM_TYPEMOUSE : (Mouse :TRawInputMouse;);
      RIM_TYPEKEYBOARD : (Keyb :TRawInputKeys;);
      RIM_TYPEHID : (Hid : TRawInputHid;);
    end;
  TRIDMouseInfo = record
     dwId :DWORD;
     dwNumberOfButtons :DWORD;
     dwSampleRate :DWORD;
     fHasHorizontalWeel :boolean;
   end;

   TRIDKeysInfo = record
     dwType :DWORD;
     dwSubType :DWORD;
     dwKeyboardMode :DWORD;
     dwNumberOfFunctionKeys :DWORD;
     dwNumberOfIndicators :DWORD;
     dwNumberOfKeysTotal :DWORD;
   end;

  TRIDHidInfo = record
     dwVendorId :DWORD;
     dwProductId :DWORD;
     dwVersionNumber :DWORD;
     UsagePage :TUsage;
     Usage :TUsage;
  end;

  PRIDDeviceInfo = ^TRIDDeviceInfo;
  TRIDDeviceInfo = record // Информация об устройстве
    cbSize :DWORD;
    dwType :TRawInputType;
    Case TRawInputType of
       RIM_TYPEMOUSE : (Mouse :TRIDMouseInfo;);
       RIM_TYPEKEYBOARD : (Keyb :TRIDKeysInfo;);
       RIM_TYPEHID : (Hid :TRIDHidInfo;);
    end;
//---------------------------------------------------------------------

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure  WndProc1(var Message :TMessage);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormActivate(Sender: TObject);
 var Rid :TRawInputDevice;
begin
 try
   Rid.UsagePage := HID_USAGE_PAGE_GENERIC; // Для сканера нужно взять соответствующий USAGE
   Rid.Usage := HID_USAGE_GENERIC_MOUSE;
   Rid.Flags := RIDEV_NOLEGACY;
   Rid.Target := Self.WindowHandle;
   //Подписываем свое окно на получение данных по RawInput
   if RegisterRawInputDevices(@Rid, 1, sizeof(Rid)) then begin  // Процедура RegisterRawInputDevices импортирована из User32.dll
      Memo1.Lines.Add('Зарегистрировано!');
      Self.WindowProc := WndProc1;
    end
    else raise Exception.Create('Нет подписки!');
 finally
   //
 end;
end;

procedure TForm1.WndProc1(var Message :TMessage);
 var
    i, dwSize, pcbSize :DWORD;
    Data :Array of Byte;
    P :PRawInputRecord;
    B :Byte;
    s :String;
    RidInfo : TRidDeviceInfo;
    HHandle :THandle;
 begin
   WndProc(Message);
   if Message.Msg =  wm_input then begin  //сообщение wm_input посылается приложению-подписчику при поступлении данных от USB устройства
   //  Процедура GetRawInputData импортирована из User32.dll
   GetRawInputData(Message.LParam, RID_INPUT, nil, dwSize, sizeof(TRawInputHeader));
   SetLength(Data, dwSize);
   if boolean(GetRawInputData(Message.LParam, RID_INPUT, Data, dwSize, sizeof(TRawInputHeader))) then
    begin
     P := PRawInputRecord(@Data[0]);
     HHandle := P^.Header.hDevice;
     S := '';
     if TRawInputType(P^.Header.dwType) = RIM_TYPEMOUSE then begin
       S:= Format('X = %d Y = %d ulButtons = %d Wheel = %d', [
        P^.Mouse.lLastX,
        P^.Mouse.lLastY,
        (P^.Mouse.ulButtons and ($FFFF-$0400)),
        P^.Mouse.ulButtons and ($0400 shr 10)
         ]);

    end;
    Memo1.Lines.Add(S);
   end
    else
     Memo1.Lines.Add('Ошибка ввода!');
     pcbSize := Sizeof(RidInfo);
     FillChar(RidInfo, SizeOf(RidInfo), 0);
     RidInfo.cbSize := pcbSize;
     if boolean(GetRawInputDeviceInfoA(HHandle, RIDI_DEVICEINFO, @RidInfo, pcbSize)) then begin
      if TRawInputType(RidInfo.dwType) =RIM_TYPEMOUSE then begin
        Memo1.Lines.Add('MouseId: ' + IntToStr(RidInfo.Mouse.dwId));
      end;
     end;
      //  Процедура GetRawInputDeviceInfoA импортирована из User32.dll
     GetRawInputDeviceInfoA(HHandle, RIDI_PREPARSEDDATA, nil, pcbSize);
     SetLength(Data, pcbSize);
     //Получаем информацию об устройстве
     if boolean(GetRawInputDeviceInfoA(HHandle, RIDI_PREPARSEDDATA, Data, pcbSize)) then begin
        Memo1.Lines.Add(Format('DevName: %s', [StrPas(PAnsiChar(@Data[0]))]));
      end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.WindowProc := WndProc;
end;

end.


unit uRawInput;
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
unit uRawInput;

 interface

 uses Windows;

 //
 // Raw Input Messages.
 //

 type
 HRAWINPUT = THANDLE;
 {$EXTERNALSYM HRAWINPUT}

 //
 // WM_INPUT wParam
 //

 //
 // Use this macro to get the input code from wParam.
 //

 function GET_RAWINPUT_CODE_WPARAM(wParam: WPARAM): DWORD;
 {$EXTERNALSYM GET_RAWINPUT_CODE_WPARAM}

 //
 // The input is in the regular message flow,
 // the app is required to call DefWindowProc
 // so that the system can perform clean ups.
 //

 const
 RIM_INPUT = 0;
 {$EXTERNALSYM RIM_INPUT}

 //
 // The input is sink only. The app is expected
 // to behave nicely.
 //

 RIM_INPUTSINK = 1;
 {$EXTERNALSYM RIM_INPUTSINK}

 //
 // Raw Input data header
 //

 type
 tagRAWINPUTHEADER = record
 dwType: DWORD;
 dwSize: DWORD;
 hDevice: THANDLE;
 wParam: WPARAM;
 end;
 {$EXTERNALSYM tagRAWINPUTHEADER}
 RAWINPUTHEADER = tagRAWINPUTHEADER;
 {$EXTERNALSYM RAWINPUTHEADER}
 PRAWINPUTHEADER = ^RAWINPUTHEADER;
 {$EXTERNALSYM PRAWINPUTHEADER}
 LPRAWINPUTHEADER = ^RAWINPUTHEADER;
 {$EXTERNALSYM LPRAWINPUTHEADER}
 TRawInputHeader = RAWINPUTHEADER;

 //
 // Type of the raw input
 //

 const
 RIM_TYPEMOUSE = 0;
 {$EXTERNALSYM RIM_TYPEMOUSE}
 RIM_TYPEKEYBOARD = 1;
 {$EXTERNALSYM RIM_TYPEKEYBOARD}
 RIM_TYPEHID = 2;
 {$EXTERNALSYM RIM_TYPEHID}

 //
 // Raw format of the mouse input
 //

 type
 tagRAWMOUSE = record
 //
 // Indicator flags.
 //
 usFlags: WORD;

 //
 // The transition state of the mouse buttons.
 //

 union: record
 case Integer of
 0: (
 ulButtons: ULONG);
 1: (
 usButtonFlags: WORD;
 usButtonData: WORD);
 end;

 //
 // The raw state of the mouse buttons.
 //
 ulRawButtons: ULONG;

 //
 // The signed relative or absolute motion in the X direction.
 //
 lLastX: LongInt;

 //
 // The signed relative or absolute motion in the Y direction.
 //
 lLastY: LongInt;

 //
 // Device-specific additional information for the event.
 //
 ulExtraInformation: ULONG;
 end;
 {$EXTERNALSYM tagRAWMOUSE}
 RAWMOUSE = tagRAWMOUSE;
 {$EXTERNALSYM RAWMOUSE}
 PRAWMOUSE = ^RAWMOUSE;
 {$EXTERNALSYM PRAWMOUSE}
 LPRAWMOUSE = ^RAWMOUSE;
 {$EXTERNALSYM LPRAWMOUSE}
 TRawMouse = RAWMOUSE;

 //
 // Define the mouse button state indicators.
 //

 const
 RI_MOUSE_LEFT_BUTTON_DOWN = $0001; // Left Button changed to down.
 {$EXTERNALSYM RI_MOUSE_LEFT_BUTTON_DOWN}
 RI_MOUSE_LEFT_BUTTON_UP = $0002; // Left Button changed to up.
 {$EXTERNALSYM RI_MOUSE_LEFT_BUTTON_UP}
 RI_MOUSE_RIGHT_BUTTON_DOWN = $0004; // Right Button changed to down.
 {$EXTERNALSYM RI_MOUSE_RIGHT_BUTTON_DOWN}
 RI_MOUSE_RIGHT_BUTTON_UP = $0008; // Right Button changed to up.
 {$EXTERNALSYM RI_MOUSE_RIGHT_BUTTON_UP}
 RI_MOUSE_MIDDLE_BUTTON_DOWN = $0010; // Middle Button changed to down.
 {$EXTERNALSYM RI_MOUSE_MIDDLE_BUTTON_DOWN}
 RI_MOUSE_MIDDLE_BUTTON_UP = $0020; // Middle Button changed to up.
 {$EXTERNALSYM RI_MOUSE_MIDDLE_BUTTON_UP}

 RI_MOUSE_BUTTON_1_DOWN = RI_MOUSE_LEFT_BUTTON_DOWN;
 {$EXTERNALSYM RI_MOUSE_BUTTON_1_DOWN}
 RI_MOUSE_BUTTON_1_UP = RI_MOUSE_LEFT_BUTTON_UP;
 {$EXTERNALSYM RI_MOUSE_BUTTON_1_UP}
 RI_MOUSE_BUTTON_2_DOWN = RI_MOUSE_RIGHT_BUTTON_DOWN;
 {$EXTERNALSYM RI_MOUSE_BUTTON_2_DOWN}
 RI_MOUSE_BUTTON_2_UP = RI_MOUSE_RIGHT_BUTTON_UP;
 {$EXTERNALSYM RI_MOUSE_BUTTON_2_UP}
 RI_MOUSE_BUTTON_3_DOWN = RI_MOUSE_MIDDLE_BUTTON_DOWN;
 {$EXTERNALSYM RI_MOUSE_BUTTON_3_DOWN}
 RI_MOUSE_BUTTON_3_UP = RI_MOUSE_MIDDLE_BUTTON_UP;
 {$EXTERNALSYM RI_MOUSE_BUTTON_3_UP}

 RI_MOUSE_BUTTON_4_DOWN = $0040;
 {$EXTERNALSYM RI_MOUSE_BUTTON_4_DOWN}
 RI_MOUSE_BUTTON_4_UP = $0080;
 {$EXTERNALSYM RI_MOUSE_BUTTON_4_UP}
 RI_MOUSE_BUTTON_5_DOWN = $0100;
 {$EXTERNALSYM RI_MOUSE_BUTTON_5_DOWN}
 RI_MOUSE_BUTTON_5_UP = $0200;
 {$EXTERNALSYM RI_MOUSE_BUTTON_5_UP}

 //
 // If usButtonFlags has RI_MOUSE_WHEEL, the wheel delta is stored in usButtonData.
 // Take it as a signed value.
 //

 RI_MOUSE_WHEEL = $0400;
 {$EXTERNALSYM RI_MOUSE_WHEEL}

 //
 // Define the mouse indicator flags.
 //

 MOUSE_MOVE_RELATIVE = 0;
 {$EXTERNALSYM MOUSE_MOVE_RELATIVE}
 MOUSE_MOVE_ABSOLUTE = 1;
 {$EXTERNALSYM MOUSE_MOVE_ABSOLUTE}
 MOUSE_VIRTUAL_DESKTOP = $02; // the coordinates are mapped to the virtual desktop
 {$EXTERNALSYM MOUSE_VIRTUAL_DESKTOP}
 MOUSE_ATTRIBUTES_CHANGED = $04; // requery for mouse attributes
 {$EXTERNALSYM MOUSE_ATTRIBUTES_CHANGED}

 //
 // Raw format of the keyboard input
 //

 type
 tagRAWKEYBOARD = record
 //
 // The "make" scan code (key depression).
 //
 MakeCode: WORD;

 //
 // The flags field indicates a "break" (key release) and other
 // miscellaneous scan code information defined in ntddkbd.h.
 //
 Flags: WORD;

 Reserved: WORD;

 //
 // Windows message compatible information
 //
 VKey: WORD;
 Message: UINT;

 //
 // Device-specific additional information for the event.
 //
 ExtraInformation: ULONG;
 end;
 {$EXTERNALSYM tagRAWKEYBOARD}
 RAWKEYBOARD = tagRAWKEYBOARD;
 {$EXTERNALSYM RAWKEYBOARD}
 PRAWKEYBOARD = ^RAWKEYBOARD;
 {$EXTERNALSYM PRAWKEYBOARD}
 LPRAWKEYBOARD = ^RAWKEYBOARD;
 {$EXTERNALSYM LPRAWKEYBOARD}
 TRawKeyBoard = RAWKEYBOARD;

 //
 // Define the keyboard overrun MakeCode.
 //

 const
 KEYBOARD_OVERRUN_MAKE_CODE = $FF;
 {$EXTERNALSYM KEYBOARD_OVERRUN_MAKE_CODE}

 //
 // Define the keyboard input data Flags.
 //

 RI_KEY_MAKE = 0;
 {$EXTERNALSYM RI_KEY_MAKE}
 RI_KEY_BREAK = 1;
 {$EXTERNALSYM RI_KEY_BREAK}
 RI_KEY_E0 = 2;
 {$EXTERNALSYM RI_KEY_E0}
 RI_KEY_E1 = 4;
 {$EXTERNALSYM RI_KEY_E1}
 RI_KEY_TERMSRV_SET_LED = 8;
 {$EXTERNALSYM RI_KEY_TERMSRV_SET_LED}
 RI_KEY_TERMSRV_SHADOW = $10;
 {$EXTERNALSYM RI_KEY_TERMSRV_SHADOW}

 //
 // Raw format of the input from Human Input Devices
 //

 type
 tagRAWHID = record
 dwSizeHid: DWORD; // byte size of each report
 dwCount: DWORD; // number of input packed
 bRawData: array [0..0] of BYTE;
 end;
 {$EXTERNALSYM tagRAWHID}
 RAWHID = tagRAWHID;
 {$EXTERNALSYM RAWHID}
 PRAWHID = ^RAWHID;
 {$EXTERNALSYM PRAWHID}
 LPRAWHID = ^RAWHID;
 {$EXTERNALSYM LPRAWHID}
 TRawHid = RAWHID;

 //
 // RAWINPUT data structure.
 //

 tagRAWINPUT = record
 header: RAWINPUTHEADER;
 case Integer of
 0: (mouse: RAWMOUSE);
 1: (keyboard: RAWKEYBOARD);
 2: (hid: RAWHID);
 end;
 {$EXTERNALSYM tagRAWINPUT}
 RAWINPUT = tagRAWINPUT;
 {$EXTERNALSYM RAWINPUT}
 PRAWINPUT = ^RAWINPUT;
 {$EXTERNALSYM PRAWINPUT}
 LPRAWINPUT = ^RAWINPUT;
 {$EXTERNALSYM LPRAWINPUT}
 TRawInput = RAWINPUT;

 function RAWINPUT_ALIGN(x: Pointer): Pointer;
 {$EXTERNALSYM RAWINPUT_ALIGN}

 function NEXTRAWINPUTBLOCK(ptr: PRawInput): PRawInput;
 {$EXTERNALSYM NEXTRAWINPUTBLOCK}

 //
 // Flags for GetRawInputData
 //

 const
 RID_INPUT = $10000003;
 {$EXTERNALSYM RID_INPUT}
 RID_HEADER = $10000005;
 {$EXTERNALSYM RID_HEADER}

 function GetRawInputData(hRawInput: HRAWINPUT; uiCommand: UINT; pData: POINTER;
 var pcbSize: UINT; cbSizeHeader: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputData}

 //
 // Raw Input Device Information
 //

 const
 RIDI_PREPARSEDDATA = $20000005;
 {$EXTERNALSYM RIDI_PREPARSEDDATA}
 RIDI_DEVICENAME = $20000007; // the return valus is the character length, not the byte size
 {$EXTERNALSYM RIDI_DEVICENAME}
 RIDI_DEVICEINFO = $2000000b;
 {$EXTERNALSYM RIDI_DEVICEINFO}

 type
 PRID_DEVICE_INFO_MOUSE = ^RID_DEVICE_INFO_MOUSE;
 {$EXTERNALSYM PRID_DEVICE_INFO_MOUSE}
 tagRID_DEVICE_INFO_MOUSE = record
 dwId: DWORD;
 dwNumberOfButtons: DWORD;
 dwSampleRate: DWORD;
 end;
 {$EXTERNALSYM tagRID_DEVICE_INFO_MOUSE}
 RID_DEVICE_INFO_MOUSE = tagRID_DEVICE_INFO_MOUSE;
 {$EXTERNALSYM RID_DEVICE_INFO_MOUSE}
 TRidDeviceInfoMouse = RID_DEVICE_INFO_MOUSE;
 PRidDeviceInfoMouse = PRID_DEVICE_INFO_MOUSE;

 PRID_DEVICE_INFO_KEYBOARD = ^RID_DEVICE_INFO_KEYBOARD;
 {$EXTERNALSYM PRID_DEVICE_INFO_KEYBOARD}
 tagRID_DEVICE_INFO_KEYBOARD = record
 dwType: DWORD;
 dwSubType: DWORD;
 dwKeyboardMode: DWORD;
 dwNumberOfFunctionKeys: DWORD;
 dwNumberOfIndicators: DWORD;
 dwNumberOfKeysTotal: DWORD;
 end;
 {$EXTERNALSYM tagRID_DEVICE_INFO_KEYBOARD}
 RID_DEVICE_INFO_KEYBOARD = tagRID_DEVICE_INFO_KEYBOARD;
 {$EXTERNALSYM RID_DEVICE_INFO_KEYBOARD}
 TRidDeviceInfoKeyboard = RID_DEVICE_INFO_KEYBOARD;
 PRidDeviceInfoKeyboard = PRID_DEVICE_INFO_KEYBOARD;

 PRID_DEVICE_INFO_HID = ^RID_DEVICE_INFO_HID;
 {$EXTERNALSYM PRID_DEVICE_INFO_HID}
 tagRID_DEVICE_INFO_HID = record
 dwVendorId: DWORD;
 dwProductId: DWORD;
 dwVersionNumber: DWORD;
 //
 // Top level collection UsagePage and Usage
 //
 usUsagePage: WORD;
 usUsage: WORD;
 end;
 {$EXTERNALSYM tagRID_DEVICE_INFO_HID}
 RID_DEVICE_INFO_HID = tagRID_DEVICE_INFO_HID;
 {$EXTERNALSYM RID_DEVICE_INFO_HID}
 TRidDeviceInfoHid = RID_DEVICE_INFO_HID;
 PRidDeviceInfoHid = PRID_DEVICE_INFO_HID;

 tagRID_DEVICE_INFO = record
 cbSize: DWORD;
 dwType: DWORD;
 case Integer of
 0: (mouse: RID_DEVICE_INFO_MOUSE);
 1: (keyboard: RID_DEVICE_INFO_KEYBOARD);
 2: (hid: RID_DEVICE_INFO_HID);
 end;
 {$EXTERNALSYM tagRID_DEVICE_INFO}
 RID_DEVICE_INFO = tagRID_DEVICE_INFO;
 {$EXTERNALSYM RID_DEVICE_INFO}
 PRID_DEVICE_INFO = ^RID_DEVICE_INFO;
 {$EXTERNALSYM PRID_DEVICE_INFO}
 LPRID_DEVICE_INFO = ^RID_DEVICE_INFO;
 {$EXTERNALSYM LPRID_DEVICE_INFO}
 TRidDeviceInfo = RID_DEVICE_INFO;
 PRidDeviceInfo = PRID_DEVICE_INFO;

 function GetRawInputDeviceInfoA(hDevice: THANDLE; uiCommand: UINT; pData: POINTER;
 var pcbSize: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputDeviceInfoA}
 function GetRawInputDeviceInfoW(hDevice: THANDLE; uiCommand: UINT; pData: POINTER;
 var pcbSize: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputDeviceInfoW}

 {$IFDEF UNICODE}
 function GetRawInputDeviceInfo(hDevice: THANDLE; uiCommand: UINT; pData: POINTER;
 var pcbSize: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputDeviceInfo}
 {$ELSE}
 function GetRawInputDeviceInfo(hDevice: THANDLE; uiCommand: UINT; pData: POINTER;
 var pcbSize: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputDeviceInfo}
 {$ENDIF}

 //
 // Raw Input Bulk Read: GetRawInputBuffer
 //

 function GetRawInputBuffer(pData: PRAWINPUT; var pcbSize: UINT; cbSizeHeader: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputBuffer}

 //
 // Raw Input request APIs
 //

 type
 LPRAWINPUTDEVICE = ^RAWINPUTDEVICE;
 {$EXTERNALSYM LPRAWINPUTDEVICE}
 PRAWINPUTDEVICE = ^RAWINPUTDEVICE;
 {$EXTERNALSYM PRAWINPUTDEVICE}
 tagRAWINPUTDEVICE = record
 usUsagePage: WORD; // Toplevel collection UsagePage
 usUsage: WORD; // Toplevel collection Usage
 dwFlags: DWORD;
 hwndTarget: HWND; // Target hwnd. NULL = follows keyboard focus
 end;
 {$EXTERNALSYM tagRAWINPUTDEVICE}
 RAWINPUTDEVICE = tagRAWINPUTDEVICE;
 {$EXTERNALSYM RAWINPUTDEVICE}
 TRawInputDevice = RAWINPUTDEVICE;

 const
 RIDEV_REMOVE = $00000001;
 {$EXTERNALSYM RIDEV_REMOVE}
 RIDEV_EXCLUDE = $00000010;
 {$EXTERNALSYM RIDEV_EXCLUDE}
 RIDEV_PAGEONLY = $00000020;
 {$EXTERNALSYM RIDEV_PAGEONLY}
 RIDEV_NOLEGACY = $00000030;
 {$EXTERNALSYM RIDEV_NOLEGACY}
 RIDEV_INPUTSINK = $00000100;
 {$EXTERNALSYM RIDEV_INPUTSINK}
 RIDEV_CAPTUREMOUSE = $00000200; // effective when mouse nolegacy is specified, otherwise it would be an error
 {$EXTERNALSYM RIDEV_CAPTUREMOUSE}
 RIDEV_NOHOTKEYS = $00000200; // effective for keyboard.
 {$EXTERNALSYM RIDEV_NOHOTKEYS}
 RIDEV_APPKEYS = $00000400; // effective for keyboard.
 {$EXTERNALSYM RIDEV_APPKEYS}
 RIDEV_EXMODEMASK = $000000F0;
 {$EXTERNALSYM RIDEV_EXMODEMASK}

 function RIDEV_EXMODE(mode: DWORD): DWORD;
 {$EXTERNALSYM RIDEV_EXMODE}

 function RegisterRawInputDevices(pRawInputDevices: PRAWINPUTDEVICE;
 uiNumDevices: UINT; cbSize: UINT): BOOL; stdcall;
 {$EXTERNALSYM RegisterRawInputDevices}

 function GetRegisteredRawInputDevices(pRawInputDevices: PRAWINPUTDEVICE;
 var puiNumDevices: UINT; cbSize: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRegisteredRawInputDevices}

 type
 PRAWINPUTDEVICELIST = ^RAWINPUTDEVICELIST;
 {$EXTERNALSYM PRAWINPUTDEVICELIST}
 tagRAWINPUTDEVICELIST = record
 hDevice: THANDLE;
 dwType: DWORD;
 end;
 {$EXTERNALSYM tagRAWINPUTDEVICELIST}
 RAWINPUTDEVICELIST = tagRAWINPUTDEVICELIST;
 {$EXTERNALSYM RAWINPUTDEVICELIST}
 TRawInputDeviceList = RAWINPUTDEVICELIST;

 function GetRawInputDeviceList(pRawInputDeviceList: PRAWINPUTDEVICELIST; var puiNumDevices: UINT;
 cbSize: UINT): UINT; stdcall;
 {$EXTERNALSYM GetRawInputDeviceList}

 //function DefRawInputProc(paRawInput: PRAWINPUT; nInput: Integer; cbSizeHeader: UINT): LRESULT; stdcall;
 { The documentation says that this procedure is called "with the same parameters received by the window procedure"
 so, eventhough the documentation shows the parameter list above, I have changed it to
 the standard windows message procedure parameters.}
 function DefRawInputProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
 //function DefRawInputProc(Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
 {$EXTERNALSYM DefRawInputProc}

 implementation

 const
 user32 = 'user32.dll';

 function GET_RAWINPUT_CODE_WPARAM(wParam: WPARAM): DWORD;
 begin
 Result := wParam and $ff;
 end;

 function RAWINPUT_ALIGN(x: Pointer): Pointer;
 begin
 Result := Pointer((Integer(x) + SizeOf(DWORD) - 1) and not (SizeOf(DWORD) - 1));
 end;

 function NEXTRAWINPUTBLOCK(ptr: PRawInput): PRawInput;
 begin
 Result := PRAWINPUT(DWORD(RAWINPUT_ALIGN(ptr)) + ptr^.header.dwSize);
 end;


 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputData: Pointer;

 function GetRawInputData;
 begin
 GetProcedureAddress(_GetRawInputData, user32, 'GetRawInputData');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputData]
 end;
 end;
 {$ELSE}
 function GetRawInputData; external user32 name 'GetRawInputData';
 {$ENDIF DYNAMIC_LINK}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputDeviceInfoA: Pointer;

 function GetRawInputDeviceInfoA;
 begin
 GetProcedureAddress(_GetRawInputDeviceInfoA, user32, 'GetRawInputDeviceInfoA');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputDeviceInfoA]
 end;
 end;
 {$ELSE}
 function GetRawInputDeviceInfoA; external user32 name 'GetRawInputDeviceInfoA';
 {$ENDIF DYNAMIC_LINK}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputDeviceInfoW: Pointer;

 function GetRawInputDeviceInfoW;
 begin
 GetProcedureAddress(_GetRawInputDeviceInfoW, user32, 'GetRawInputDeviceInfoW');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputDeviceInfoW]
 end;
 end;
 {$ELSE}
 function GetRawInputDeviceInfoW; external user32 name 'GetRawInputDeviceInfoW';
 {$ENDIF DYNAMIC_LINK}
 {$IFDEF UNICODE}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputDeviceInfo: Pointer;

 function GetRawInputDeviceInfo;
 begin
 GetProcedureAddress(_GetRawInputDeviceInfo, user32, 'GetRawInputDeviceInfoW');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputDeviceInfo]
 end;
 end;
 {$ELSE}
 function GetRawInputDeviceInfo; external user32 name 'GetRawInputDeviceInfoW';
 {$ENDIF DYNAMIC_LINK}
 {$ELSE}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputDeviceInfo: Pointer;

 function GetRawInputDeviceInfo;
 begin
 GetProcedureAddress(_GetRawInputDeviceInfo, user32, 'GetRawInputDeviceInfoA');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputDeviceInfo]
 end;
 end;
 {$ELSE}
 function GetRawInputDeviceInfo; external user32 name 'GetRawInputDeviceInfoA';
 {$ENDIF DYNAMIC_LINK}
 {$ENDIF}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputBuffer: Pointer;

 function GetRawInputBuffer;
 begin
 GetProcedureAddress(_GetRawInputBuffer, user32, 'GetRawInputBuffer');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputBuffer]
 end;
 end;
 {$ELSE}
 function GetRawInputBuffer; external user32 name 'GetRawInputBuffer';
 {$ENDIF DYNAMIC_LINK}

 function RIDEV_EXMODE(mode: DWORD): DWORD;
 begin
 Result := mode and RIDEV_EXMODEMASK;
 end;


 {$IFDEF DYNAMIC_LINK}
 var
 _RegisterRawInputDevices: Pointer;

 function RegisterRawInputDevices;
 begin
 GetProcedureAddress(_RegisterRawInputDevices, user32, 'RegisterRawInputDevices');
 asm
 mov esp, ebp
 pop ebp
 jmp [_RegisterRawInputDevices]
 end;
 end;
 {$ELSE}
 function RegisterRawInputDevices; external user32 name 'RegisterRawInputDevices';
 {$ENDIF DYNAMIC_LINK}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRegisteredRawInputDevices: Pointer;

 function GetRegisteredRawInputDevices;
 begin
 GetProcedureAddress(_GetRegisteredRawInputDevices, user32, 'GetRegisteredRawInputDevices');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRegisteredRawInputDevices]
 end;
 end;
 {$ELSE}
 function GetRegisteredRawInputDevices; external user32 name 'GetRegisteredRawInputDevices';
 {$ENDIF DYNAMIC_LINK}

 {$IFDEF DYNAMIC_LINK}
 var
 _GetRawInputDeviceList: Pointer;

 function GetRawInputDeviceList;
 begin
 GetProcedureAddress(_GetRawInputDeviceList, user32, 'GetRawInputDeviceList');
 asm
 mov esp, ebp
 pop ebp
 jmp [_GetRawInputDeviceList]
 end;
 end;
 {$ELSE}
 function GetRawInputDeviceList; external user32 name 'GetRawInputDeviceList';
 {$ENDIF DYNAMIC_LINK}

 {$IFDEF DYNAMIC_LINK}
 var
 _DefRawInputProc: Pointer;

 function DefRawInputProc;
 begin
 GetProcedureAddress(_DefRawInputProc, user32, 'DefRawInputProc');
 asm
 mov esp, ebp
 pop ebp
 jmp [_DefRawInputProc]
 end;
 end;
 {$ELSE}
 function DefRawInputProc; external user32 name 'DefRawInputProc';
 {$ENDIF DYNAMIC_LINK}

 end.

...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / raw input инплемент для дельфи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]