Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Пример опроса мыши методами DirectInput

01.01.2007
{******************************************************************************
 
*                                                                            *
 
*  Придумал и написал Кода Виктор, Март 2002                                 *
 
*                                                                            *
 
*  Файл:       main.pas                                                      *
 
*  Содержание: Пример буферизированного опроса мыши методами DirectInput     *
 
*                                                                            *
 
******************************************************************************}
unit main
;
 
interface
 
uses
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls,
 
ExtCtrls;
 
type
  TForm1
= class(TForm)
    gb1
: TGroupBox;
    lbX0
: TLabel;
    lbY0
: TLabel;
    lbX
: TLabel;
    lbY
: TLabel;
    lb1
: TLabel;
    lb2
: TLabel;
    lb3
: TLabel;
    lb4
: TLabel;
    lbBtn1
: TLabel;
    lbBtn2
: TLabel;
    lbBtn3
: TLabel;
    lbBtn4
: TLabel;
    imCursor
: TImage;
    procedure
FormActivate(Sender: TObject);
    procedure
FormKeyDown(Sender: TObject; var Key: Word;
     
Shift: TShiftState);
    procedure
FormDestroy(Sender: TObject);
 
private
   
{ Private declarations }
 
public
   
{ Public declarations }
    procedure
Idle( Sender: TObject; var Done: Boolean );
 
end;
 
var
  Form1
: TForm1;
 
implementation
 
{$R *.DFM}
 
uses
  DirectInput8
;
 
 
 
 
//------------------------------------------------------------------------------
// Константы и глобальные переменные
//------------------------------------------------------------------------------
var
  lpDI8
:     IDirectInput8       = nil;
  lpDIMouse
: IDirectInputDevice8 = nil;
 
  mouseX
:    LongInt = 0;
  mouseY
:    LongInt = 0;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      InitDirectInput()
// Описание: Производит инициализацию объектов DirectInput в программе
//------------------------------------------------------------------------------
function InitDirectInput( hWnd: HWND ): Boolean;
var
  dipropdw
: TDIPROPDWORD; // Структура для задания характеристик мыши
begin
 
Result := FALSE;
 
 
// Создаём главный объект DirectInput
 
if FAILED( DirectInput8Create( GetModuleHandle( 0 ), DIRECTINPUT_VERSION,
                                 IID_IDirectInput8
, lpDI8, nil ) ) then
     
Exit;
  lpDI8
._AddRef();
 
 
// Создаём объект для работы с мышью
 
if FAILED( lpDI8.CreateDevice( GUID_SysMouse, lpDIMouse, nil ) ) then
     
Exit;
  lpDIMouse
._AddRef();
 
 
// Устанавлаваем предопределённый формат данных
 
if FAILED( lpDIMouse.SetDataFormat( @c_dfDIMouse ) ) then
     
Exit;
 
 
// Устанавливаем уровень кооперации
 
if FAILED( lpDIMouse.SetCooperativeLevel( hWnd, DISCL_FOREGROUND or
                                                  DISCL_EXCLUSIVE
) ) then
     
Exit;
 
 
// Подготавливаем структуру TDIPROPDWORD, она поможет установить нам
 
// буферизированный опрос мыши
 
ZeroMemory( @dipropdw, SizeOf( TDIPROPDWORD ) );
  dipropdw
.diph.dwSize := SizeOf( TDIPROPDWORD );
  dipropdw
.diph.dwHeaderSize := SizeOf( TDIPROPHEADER );
 
  dipropdw
.diph.dwObj := 0;
  dipropdw
.diph.dwHow := DIPH_DEVICE; // Изменяем х-ки всего устройства
  dipropdw
.dwData := 16;              // Размер буфера для данных (по умолчанию 0)
 
 
// Устанавливаем размер буфера для мыши
 
if FAILED( lpDIMouse.SetProperty( DIPROP_BUFFERSIZE, dipropdw.diph ) ) then
     
Exit;
 
 
// Захвытываем мышь
  lpDIMouse
.Acquire();
 
 
Result := TRUE;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      ReleaseDirectInput()
// Описание: Производит удаление объектов DirectInput
//------------------------------------------------------------------------------
procedure
ReleaseDirectInput();
begin
 
// Удаляем объект для работы с мышью
 
if lpDIMouse <> nil then
 
begin
    lpDIMouse
.Unacquire();
    lpDIMouse
._Release();
    lpDIMouse
:= nil;
 
end;
 
 
// Удаляем главный объект DirectInput (всегда последним)
 
if lpDI8 <> nil then
 
begin
    lpDI8
._Release();
    lpDI8
:= nil;
 
end;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      GetMouseCaps()
// Описание: Получает характеристики мыши (определяет кол-во кнопок)
//------------------------------------------------------------------------------
procedure
GetMouseCaps();
var
  lpCaps
: TDIDEVCAPS; // Структура для получения данных об элементах мыши
begin
 
// Подготавливаем структуру TDIDEVCAPS (для получения характеристик мыши)
 
ZeroMemory( @lpCaps, SizeOf( TDIDEVCAPS ) );
  lpCaps
.dwSize := SizeOf( TDIDEVCAPS );
 
 
// Получаем характеристики мыши, данные записывааются в структуру lpCaps
  lpDIMouse
.GetCapabilities( lpCaps );
 
 
// Приводим UI в соответствующий вид
 
with Form1 do
 
begin
   
if lpCaps.dwButtons > 0 then
   
begin
      lb1
.Enabled := TRUE; lbBtn1.Enabled := TRUE;
   
end;
 
   
if lpCaps.dwButtons > 1 then
   
begin
      lb2
.Enabled := TRUE; lbBtn2.Enabled := TRUE;
   
end;
 
   
if lpCaps.dwButtons > 2 then
   
begin
      lb3
.Enabled := TRUE; lbBtn3.Enabled := TRUE;
   
end;
 
   
if lpCaps.dwButtons > 3 then
   
begin
      lb4
.Enabled := TRUE; lbBtn4.Enabled := TRUE;
   
end;
 
end;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      UpdateMouseState()
// Описание: Производит опрос мыши и выводит данные в окно
//------------------------------------------------------------------------------
function UpdateMouseState( var(*по параметру*)dwX, dwY: DWORD ): Boolean;
var
  od
:         TDIDEVICEOBJECTDATA;
  dwElements
: DWORD;
begin
 
Result := FALSE;
 
 
// Обазательно обнуляем!
  dwX
:= 0;
  dwY
:= 0;
 
  dwElements
:= 1;
 
 
// Пока количество опрашиваемых элементов мыши (оси, кнопки, колёсики ) <> 0
 
while dwElements <> 0 do
 
begin
   
// Получаем данные от мыши
   
if lpDIMouse.GetDeviceData( SizeOf( TDIDEVICEOBJECTDATA ), @od,
                                dwElements
, 0 ) = DIERR_INPUTLOST then
   
begin
     
// Снова захватываем
      lpDIMouse
.Acquire();
     
// Если всё бесполезно, то выходим
     
if FAILED( lpDIMouse.GetDeviceData( SizeOf( TDIDEVICEOBJECTDATA ), @od,
                                          dwElements
, 0 ) ) then
         
Exit;
   
end;
 
   
with Form1 do
   
begin
     
case od.dwOfs of
        DIMOFS_X
:       dwX := od.dwData;
        DIMOFS_Y
:       dwY := od.dwData;
        DIMOFS_BUTTON0
: if od.dwData = $080 then lbBtn1.Caption := 'Нажата'
                                           
else lbBtn1.Caption := '';
        DIMOFS_BUTTON1
: if od.dwData = $080 then lbBtn2.Caption := 'Нажата'
                                           
else lbBtn2.Caption := '';
        DIMOFS_BUTTON2
: if od.dwData = $080 then lbBtn3.Caption := 'Нажата'
                                           
else lbBtn3.Caption := '';
        DIMOFS_BUTTON3
: if od.dwData = $080 then lbBtn4.Caption := 'Нажата'
                                           
else lbBtn4.Caption := '';
     
end;
   
end;
 
end;
 
 
Result := TRUE;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.Idle()
// Описание: Вызывает функцию опроса состояния мыши
//------------------------------------------------------------------------------
procedure TForm1
.Idle( Sender: TObject; var Done: Boolean );
var
  dwOffsX
,
  dwOffsY
: DWORD; // Смещение мыши
begin
 
// Получаем данные и записываем их в offsX и offsY
 
if not UpdateMouseState( dwOffsX, dwOffsY ) then
 
begin
   
MessageBox( Form1.Handle, 'Потеряно устройство ввода!',
               
'Ошибка', MB_ICONHAND );
    Form1
.Close();
 
end;
 
 
// Вычисляем абсолютные координаты
 
Inc( mouseX, dwOffsX );
 
Inc( mouseY, dwOffsY );
 
  lbX
.Caption := Format( '%d', [ mouseX ] );
  lbY
.Caption := Format( '%d', [ mouseY ] );
 
  imCursor
.Left := 234 + mouseX; // 234 - координата, если мы хотим, чтобы
  imCursor
.Top  := 234 + mouseY; // курсор был с начала работы в центре окна
 
 
Done := FALSE;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.FormActivate()
// Описание: Производит инициализацию DirectInput при активизации окна
//------------------------------------------------------------------------------
procedure TForm1
.FormActivate(Sender: TObject);
begin
 
if not InitDirectInput( Form1.Handle ) then
 
begin
   
MessageBox( Form1.Handle, 'Ошибка при инициализации DirectInput!',
               
'Ошибка!', MB_ICONHAND );
    Form1
.Close();
 
end;
 
 
// Получаем характеристики мыши (сколько кнопок?). Кстати, я не знаю - как
 
// определить, есть ли у мыши колёсико?
 
GetMouseCaps();
 
 
// Приводим UI в соответствующий вид
  lbBtn1
.Caption := '';
  lbBtn2
.Caption := '';
  lbBtn3
.Caption := '';
  lbBtn4
.Caption := '';
 
 
Application.OnIdle := Idle;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.FormKeyDown()
// Описание: Обрабатывает клавиатурный ввод
//------------------------------------------------------------------------------
procedure TForm1
.FormKeyDown(Sender: TObject; var Key: Word;
 
Shift: TShiftState);
begin
 
if Key = VK_ESCAPE then Form1.Close();
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.FormDestroy()
// Описание: Вызывается при удалении программы из памяти
//------------------------------------------------------------------------------
procedure TForm1
.FormDestroy(Sender: TObject);
begin
 
ReleaseDirectInput();
end;
 
end.

Форма:

object Form1: TForm1
 
Left = 221
 
Top = 31
 
BorderIcons = []
 
BorderStyle = bsSingle
 
Caption =
   
'DirectInput 8: буферизированный опрос мыши (нажмите Esc для выхо' +
   
'да)'
 
ClientHeight = 500
 
ClientWidth = 500
 
Color = clBtnFace
 
Font.Charset = DEFAULT_CHARSET
 
Font.Color = clWindowText
 
Font.Height = -11
 
Font.Name = 'MS Sans Serif'
 
Font.Style = []
 
KeyPreview = True
 
OldCreateOrder = False
 
Position = poScreenCenter
 
OnActivate = FormActivate
 
OnDestroy = FormDestroy
 
OnKeyDown = FormKeyDown
 
PixelsPerInch = 96
 
TextHeight = 13
 
object imCursor: TImage
   
Left = 234
   
Top = 234
   
Width = 32
   
Height = 32
   
AutoSize = True
   
Picture.Data = {
     
055449636F6E0000010001002020000001000800A80800001600000028000000
     
2000000040000000010008000000000080040000000000000000000000010000
     
0000000000000000800080008000000080800000008000000080800000008000
      C0C0C000C0DCC000F0CAA60080808000FF00FF00FF000000FFFF000000FF0000
     
00FFFF000000FF00FFFFFF00F0FBFF00A4A0A000D4F0FF00B1E2FF008ED4FF00
     
6BC6FF0048B8FF0025AAFF0000AAFF000092DC00007AB90000629600004A7300
     
00325000D4E3FF00B1C7FF008EABFF006B8FFF004873FF002557FF000055FF00
     
0049DC00003DB900003196000025730000195000D4D4FF00B1B1FF008E8EFF00
     
6B6BFF004848FF002525FF000000FF000000DC000000B9000000960000007300
     
00005000E3D4FF00C7B1FF00AB8EFF008F6BFF007348FF005725FF005500FF00
     
4900DC003D00B900310096002500730019005000F0D4FF00E2B1FF00D48EFF00
      C66BFF00B848FF00AA25FF00AA00FF009200DC007A00B900620096004A007300
     
32005000FFD4FF00FFB1FF00FF8EFF00FF6BFF00FF48FF00FF25FF00FF00FF00
      DC00DC00B900B900960096007300730050005000FFD4F000FFB1E200FF8ED400
      FF6BC600FF48B800FF25AA00FF00AA00DC009200B9007A009600620073004A00
     
50003200FFD4E300FFB1C700FF8EAB00FF6B8F00FF487300FF255700FF005500
      DC004900B9003D00960031007300250050001900FFD4D400FFB1B100FF8E8E00
      FF6B6B00FF484800FF252500FF000000DC000000B90000009600000073000000
     
50000000FFE3D400FFC7B100FFAB8E00FF8F6B00FF734800FF572500FF550000
      DC490000B93D0000963100007325000050190000FFF0D400FFE2B100FFD48E00
      FFC66B00FFB84800FFAA2500FFAA0000DC920000B97A000096620000734A0000
     
50320000FFFFD400FFFFB100FFFF8E00FFFF6B00FFFF4800FFFF2500FFFF0000
      DCDC0000B9B90000969600007373000050500000F0FFD400E2FFB100D4FF8E00
      C6FF6B00B8FF4800AAFF2500AAFF000092DC00007AB90000629600004A730000
     
32500000E3FFD400C7FFB100ABFF8E008FFF6B0073FF480057FF250055FF0000
     
49DC00003DB90000319600002573000019500000D4FFD400B1FFB1008EFF8E00
     
6BFF6B0048FF480025FF250000FF000000DC000000B900000096000000730000
     
00500000D4FFE300B1FFC7008EFFAB006BFF8F0048FF730025FF570000FF5500
     
00DC490000B93D00009631000073250000501900D4FFF000B1FFE2008EFFD400
     
6BFFC60048FFB80025FFAA0000FFAA0000DC920000B97A000096620000734A00
     
00503200D4FFFF00B1FFFF008EFFFF006BFFFF0048FFFF0025FFFF0000FFFF00
     
00DCDC0000B9B900009696000073730000505000F2F2F200E6E6E600DADADA00
      CECECE00C2C2C200B6B6B600AAAAAA009E9E9E0092929200868686007A7A7A00
     
6E6E6E0062626200565656004A4A4A003E3E3E0032323200262626001A1A1A00
     
0E0E0E0000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000BABA00000000000000000000000000000000000000
     
00000000000000000000C5C5C5BA000000000000000000000000000000000000
     
00000000000000000000C5ABC5BA000000000000000000000000000000000000
     
000000000000000000C5ABC5BA00000000000000000000000000000000000000
     
00000000C500000000C5ABC5BA00000000000000000000000000000000000000
     
00000000C2C50000C5ABC5BA0000000000000000000000000000000000000000
     
00000000C2C3C500C5ABC5BA0000000000000000000000000000000000000000
     
00000000C2C3C3C5ABBABA000000000000000000000000000000000000000000
     
00000000C2C3C3C4C4C4C5C5BABAD30000000000000000000000000000000000
     
00000000C2C3C3C4C4D1D1D1BAD3000000000000000000000000000000000000
     
00000000C2C3C3C4C4D1D1BAD300000000000000000000000000000000000000
     
00000000C2C3C4C4D1D1D1D30000000000000000000000000000000000000000
     
00000000C2C3C4C4D1D1D3000000000000000000000000000000000000000000
     
00000000C2C3C4D1D1BA00000000000000000000000000000000000000000000
     
00000000C2C4D1D1BA0000000000000000000000000000000000000000000000
     
00000000C2C4D1C5000000000000000000000000000000000000000000000000
     
00000000C2C5C500000000000000000000000000000000000000000000000000
     
00000000C2C50000000000000000000000000000000000000000000000000000
     
00000000D0000000000000000000000000000000000000000000000000000000
     
00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFC3FFFFF
      FC3FFFFFF87FFFFF787FFFFF30FFFFFF10FFFFFF01FFFFFF001FFFFF003FFFFF
     
007FFFFF00FFFFFF01FFFFFF03FFFFFF07FFFFFF0FFFFFFF1FFFFFFF3FFFFFFF
     
7FFFFFFF}
 
end
 
object gb1: TGroupBox
   
Left = 360
   
Top = 8
   
Width = 129
   
Height = 145
   
Caption = 'Состояние мыши'
   
TabOrder = 0
   
object lbX0: TLabel
     
Left = 17
     
Top = 24
     
Width = 10
     
Height = 13
     
Caption = 'X:'
   
end
   
object lbY0: TLabel
     
Left = 17
     
Top = 40
     
Width = 10
     
Height = 13
     
Caption = 'Y:'
   
end
   
object lb1: TLabel
     
Left = 16
     
Top = 64
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка1:'
     
Enabled = False
   
end
   
object lb2: TLabel
     
Left = 16
     
Top = 80
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка2:'
     
Enabled = False
   
end
   
object lb3: TLabel
     
Left = 16
     
Top = 96
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка3:'
     
Enabled = False
   
end
   
object lbBtn1: TLabel
     
Left = 72
     
Top = 64
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn1'
     
Enabled = False
   
end
   
object lbBtn2: TLabel
     
Left = 72
     
Top = 80
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn2'
     
Enabled = False
   
end
   
object lbBtn3: TLabel
     
Left = 72
     
Top = 96
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn3'
     
Enabled = False
   
end
   
object lb4: TLabel
     
Left = 16
     
Top = 112
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка4:'
     
Enabled = False
   
end
   
object lbBtn4: TLabel
     
Left = 72
     
Top = 112
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn4'
     
Enabled = False
   
end
   
object lbX: TLabel
     
Left = 72
     
Top = 24
     
Width = 6
     
Height = 13
     
Caption = '0'
   
end
   
object lbY: TLabel
     
Left = 72
     
Top = 40
     
Width = 6
     
Height = 13
     
Caption = '0'
   
end
 
end
end

{******************************************************************************
 
*                                                                            *
 
*  Придумал и написал Кода Виктор, Март 2002                                 *
 
*                                                                            *
 
*  Файл:       main.pas                                                      *
 
*  Содержание: Пример непосредственного опроса мыши методами DirectInput     *
 
*                                                                            *
 
******************************************************************************}
unit main
;
 
interface
 
uses
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls,
 
ExtCtrls;
 
type
  TForm1
= class(TForm)
    gb1
: TGroupBox;
    lbX0
: TLabel;
    lbY0
: TLabel;
    lbX
: TLabel;
    lbY
: TLabel;
    lb1
: TLabel;
    lb2
: TLabel;
    lb3
: TLabel;
    lb4
: TLabel;
    lbBtn1
: TLabel;
    lbBtn2
: TLabel;
    lbBtn3
: TLabel;
    lbBtn4
: TLabel;
    imCursor
: TImage;
    lbEMail
: TLabel;
    procedure
FormActivate(Sender: TObject);
    procedure
FormKeyDown(Sender: TObject; var Key: Word;
     
Shift: TShiftState);
    procedure
FormDestroy(Sender: TObject);
 
private
   
{ Private declarations }
 
public
   
{ Public declarations }
    procedure
Idle( Sender: TObject; var Done: Boolean );
 
end;
 
var
  Form1
: TForm1;
 
implementation
 
{$R *.DFM}
 
uses
  DirectInput8
;
 
 
 
 
//------------------------------------------------------------------------------
// Константы и глобальные переменные
//------------------------------------------------------------------------------
const
  CURSOR_SPEED
= 2.0;
 
var
  lpDI8
:       IDirectInput8       = nil;
  lpDIMouse
:   IDirectInputDevice8 = nil;
 
  dwMouseXPos
: DWORD = 0;
  dwMouseYPos
: DWORD = 0;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      InitDirectInput()
// Описание: Производит инициализацию объектов DirectInput в программе
//------------------------------------------------------------------------------
function InitDirectInput( hWnd: HWND ): Boolean;
var
  dipropdw
: TDIPROPDWORD; // Структура для задания характеристик мыши
begin
 
Result := FALSE;
 
 
// Создаём главный объект DirectInput
 
if FAILED( DirectInput8Create( GetModuleHandle( 0 ), DIRECTINPUT_VERSION,
                                 IID_IDirectInput8
, lpDI8, nil ) ) then
     
Exit;
  lpDI8
._AddRef();
 
 
// Создаём объект для работы с мышью
 
if FAILED( lpDI8.CreateDevice( GUID_SysMouse, lpDIMouse, nil ) ) then
     
Exit;
  lpDIMouse
._AddRef();
 
 
// Устанавлаваем предопределённый формат данных
 
if FAILED( lpDIMouse.SetDataFormat( @c_dfDIMouse ) ) then
     
Exit;
 
 
// Устанавливаем уровень кооперации
 
if FAILED( lpDIMouse.SetCooperativeLevel( hWnd, DISCL_FOREGROUND or
                                                  DISCL_EXCLUSIVE
) ) then
     
Exit;
 
 
// Захвытываем мышь
  lpDIMouse
.Acquire();
 
 
Result := TRUE;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      ReleaseDirectInput()
// Описание: Производит удаление объектов DirectInput
//------------------------------------------------------------------------------
procedure
ReleaseDirectInput();
begin
 
// Удаляем объект для работы с мышью
 
if lpDIMouse <> nil then
 
begin
    lpDIMouse
.Unacquire();
    lpDIMouse
._Release();
    lpDIMouse
:= nil;
 
end;
 
 
// Удаляем главный объект DirectInput (всегда последним)
 
if lpDI8 <> nil then
 
begin
    lpDI8
._Release();
    lpDI8
:= nil;
 
end;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      GetMouseCaps()
// Описание: Получает характеристики мыши (определяет кол-во кнопок)
//------------------------------------------------------------------------------
procedure
GetMouseCaps();
var
  lpCaps
: TDIDEVCAPS; // Структура для получения данных об элементах мыши
begin
 
// Подготавливаем структуру TDIDEVCAPS (для получения характеристик мыши)
 
ZeroMemory( @lpCaps, SizeOf( TDIDEVCAPS ) );
  lpCaps
.dwSize := SizeOf( TDIDEVCAPS );
 
 
// Получаем характеристики мыши, данные записывааются в структуру lpCaps
  lpDIMouse
.GetCapabilities( lpCaps );
 
 
// Приводим GUI в соответствующий вид
 
with Form1 do
 
begin
   
if lpCaps.dwButtons > 0 then
   
begin
      lb1
.Enabled := TRUE; lbBtn1.Enabled := TRUE;
   
end;
 
   
if lpCaps.dwButtons > 1 then
   
begin
      lb2
.Enabled := TRUE; lbBtn2.Enabled := TRUE;
   
end;
 
   
if lpCaps.dwButtons > 2 then
   
begin
      lb3
.Enabled := TRUE; lbBtn3.Enabled := TRUE;
   
end;
 
   
if lpCaps.dwButtons > 3 then
   
begin
      lb4
.Enabled := TRUE; lbBtn4.Enabled := TRUE;
   
end;
 
end;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      UpdateMouseState()
// Описание: Производит опрос мыши и выводит данные в окно
//------------------------------------------------------------------------------
function UpdateMouseState( var(*по параметру*)x, y: DWORD ): Boolean;
var
  ms
: TDIMOUSESTATE;
begin
 
Result := FALSE;
 
 
// Получаем данные от мыши
 
if lpDImouse.GetDeviceState( SizeOf( TDIMOUSESTATE ), @ms ) = DIERR_INPUTLOST then
 
begin
   
// Снова захватываем
    lpDIMouse
.Acquire();
   
// Если всё бесполезно, то выходим
   
if FAILED( lpDImouse.GetDeviceState( SizeOf( TDIMOUSESTATE ), @ms ) ) then
       
Exit;
 
end;
 
 
with Form1 do
 
begin
   
// Вот так можно сделать движение курсора с переменной скоростью
   
if ms.lX < 0 then ms.lX := Round( ms.lX * CURSOR_SPEED ) else
   
if ms.lX > 0 then ms.lX := Round( ms.lX * CURSOR_SPEED );
 
   
if ms.lY < 0 then ms.lY := Round( ms.lY * CURSOR_SPEED ) else
   
if ms.lY > 0 then ms.lY := Round( ms.lY * CURSOR_SPEED );
 
    x
:= ms.lX ;
    y
:= ms.lY;
 
   
//------
 
   
if ms.rgbButtons[ 0 ] = $080 then lbBtn1.Caption := 'Нажата'
                                 
else lbBtn1.Caption := '';
   
if ms.rgbButtons[ 1 ] = $080 then lbBtn2.Caption := 'Нажата'
                                 
else lbBtn2.Caption := '';
   
if ms.rgbButtons[ 2 ] = $080 then lbBtn3.Caption := 'Нажата'
                                 
else lbBtn3.Caption := '';
   
if ms.rgbButtons[ 3 ] = $080 then lbBtn4.Caption := 'Нажата'
                                 
else lbBtn4.Caption := '';
 
end;
 
 
Result := TRUE;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.Idle()
// Описание: Вызывает функцию опроса состояния мыши
//------------------------------------------------------------------------------
procedure TForm1
.Idle( Sender: TObject; var Done: Boolean );
var
  dwOffsX
,
  dwOffsY
: DWORD; // Смещение мыши
begin
 
// Получаем данные и записываем их в offsX и offsY
 
if not UpdateMouseState( dwOffsX, dwOffsY ) then
 
begin
   
MessageBox( Form1.Handle, 'Потеряно устройство управления!',
               
'Ошибка!', MB_ICONHAND );
    Form1
.Close();
 
end;
 
 
// Смещаем позицию курсора
 
Inc( dwMouseXPos, dwOffsX );
 
Inc( dwMouseYPos, dwOffsY );
 
  lbX
.Caption := Format( '%d', [ dwMouseXPos ] );
  lbY
.Caption := Format( '%d', [ dwMouseYPos ] );
 
  imCursor
.Left := 234 + dwMouseXPos; // 234 - координата, если мы хотим, чтобы
  imCursor
.Top  := 234 + dwMouseYPos; // курсор был с начала работы в центре окна
 
 
Done := FALSE;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.FormActivate()
// Описание: Производит инициализацию DirectInput при активизации окна
//------------------------------------------------------------------------------
procedure TForm1
.FormActivate(Sender: TObject);
begin
 
if not InitDirectInput( Form1.Handle ) then
 
begin
   
MessageBox( Form1.Handle, 'Ошибка при инициализации DirectInput!',
               
'Ошибка!', MB_ICONHAND );
    Form1
.Close();
 
end;
 
 
// Получаем характеристики мыши (сколько кнопок?). Кстати, я не знаю - как
 
// определить, есть ли у мыши колёсико?
 
GetMouseCaps();
 
 
// Приводим UI в соответствующий вид
  lbBtn1
.Caption := '';
  lbBtn2
.Caption := '';
  lbBtn3
.Caption := '';
  lbBtn4
.Caption := '';
  imCursor
.Left := 184; // Курсор центре окна
  imCursor
.Top  := 184;
 
 
Application.OnIdle := Idle;
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.FormKeyDown()
// Описание: Обрабатывает клавиатурный ввод
//------------------------------------------------------------------------------
procedure TForm1
.FormKeyDown(Sender: TObject; var Key: Word;
 
Shift: TShiftState);
begin
 
if Key = VK_ESCAPE then Form1.Close();
end;
 
 
 
 
//------------------------------------------------------------------------------
// Имя:      TForm1.FormDestroy()
// Описание: Вызывается при удалении программы из памяти
//------------------------------------------------------------------------------
procedure TForm1
.FormDestroy(Sender: TObject);
begin
 
ReleaseDirectInput();
end;
 
end.

форма:

object Form1: TForm1
 
Left = 155
 
Top = 34
 
BorderIcons = []
 
BorderStyle = bsSingle
 
Caption =
   
'DirectInput 8: непосредственный опрос мыши (нажмите Esc для выхо' +
   
'да)'
 
ClientHeight = 500
 
ClientWidth = 500
 
Color = clBtnFace
 
Font.Charset = DEFAULT_CHARSET
 
Font.Color = clWindowText
 
Font.Height = -11
 
Font.Name = 'MS Sans Serif'
 
Font.Style = []
 
KeyPreview = True
 
OldCreateOrder = False
 
Position = poScreenCenter
 
OnActivate = FormActivate
 
OnDestroy = FormDestroy
 
OnKeyDown = FormKeyDown
 
PixelsPerInch = 96
 
TextHeight = 13
 
object imCursor: TImage
   
Left = 234
   
Top = 234
   
Width = 32
   
Height = 32
   
AutoSize = True
   
Picture.Data = {
     
055449636F6E0000010001002020000001000800A80800001600000028000000
     
2000000040000000010008000000000080040000000000000000000000010000
     
0000000000000000800080008000000080800000008000000080800000008000
      C0C0C000C0DCC000F0CAA60080808000FF00FF00FF000000FFFF000000FF0000
     
00FFFF000000FF00FFFFFF00F0FBFF00A4A0A000D4F0FF00B1E2FF008ED4FF00
     
6BC6FF0048B8FF0025AAFF0000AAFF000092DC00007AB90000629600004A7300
     
00325000D4E3FF00B1C7FF008EABFF006B8FFF004873FF002557FF000055FF00
     
0049DC00003DB900003196000025730000195000D4D4FF00B1B1FF008E8EFF00
     
6B6BFF004848FF002525FF000000FF000000DC000000B9000000960000007300
     
00005000E3D4FF00C7B1FF00AB8EFF008F6BFF007348FF005725FF005500FF00
     
4900DC003D00B900310096002500730019005000F0D4FF00E2B1FF00D48EFF00
      C66BFF00B848FF00AA25FF00AA00FF009200DC007A00B900620096004A007300
     
32005000FFD4FF00FFB1FF00FF8EFF00FF6BFF00FF48FF00FF25FF00FF00FF00
      DC00DC00B900B900960096007300730050005000FFD4F000FFB1E200FF8ED400
      FF6BC600FF48B800FF25AA00FF00AA00DC009200B9007A009600620073004A00
     
50003200FFD4E300FFB1C700FF8EAB00FF6B8F00FF487300FF255700FF005500
      DC004900B9003D00960031007300250050001900FFD4D400FFB1B100FF8E8E00
      FF6B6B00FF484800FF252500FF000000DC000000B90000009600000073000000
     
50000000FFE3D400FFC7B100FFAB8E00FF8F6B00FF734800FF572500FF550000
      DC490000B93D0000963100007325000050190000FFF0D400FFE2B100FFD48E00
      FFC66B00FFB84800FFAA2500FFAA0000DC920000B97A000096620000734A0000
     
50320000FFFFD400FFFFB100FFFF8E00FFFF6B00FFFF4800FFFF2500FFFF0000
      DCDC0000B9B90000969600007373000050500000F0FFD400E2FFB100D4FF8E00
      C6FF6B00B8FF4800AAFF2500AAFF000092DC00007AB90000629600004A730000
     
32500000E3FFD400C7FFB100ABFF8E008FFF6B0073FF480057FF250055FF0000
     
49DC00003DB90000319600002573000019500000D4FFD400B1FFB1008EFF8E00
     
6BFF6B0048FF480025FF250000FF000000DC000000B900000096000000730000
     
00500000D4FFE300B1FFC7008EFFAB006BFF8F0048FF730025FF570000FF5500
     
00DC490000B93D00009631000073250000501900D4FFF000B1FFE2008EFFD400
     
6BFFC60048FFB80025FFAA0000FFAA0000DC920000B97A000096620000734A00
     
00503200D4FFFF00B1FFFF008EFFFF006BFFFF0048FFFF0025FFFF0000FFFF00
     
00DCDC0000B9B900009696000073730000505000F2F2F200E6E6E600DADADA00
      CECECE00C2C2C200B6B6B600AAAAAA009E9E9E0092929200868686007A7A7A00
     
6E6E6E0062626200565656004A4A4A003E3E3E0032323200262626001A1A1A00
     
0E0E0E0000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000000000000000000000000000000000000000000000
     
0000000000000000000000BABA00000000000000000000000000000000000000
     
00000000000000000000C5C5C5BA000000000000000000000000000000000000
     
00000000000000000000C5ABC5BA000000000000000000000000000000000000
     
000000000000000000C5ABC5BA00000000000000000000000000000000000000
     
00000000C500000000C5ABC5BA00000000000000000000000000000000000000
     
00000000C2C50000C5ABC5BA0000000000000000000000000000000000000000
     
00000000C2C3C500C5ABC5BA0000000000000000000000000000000000000000
     
00000000C2C3C3C5ABBABA000000000000000000000000000000000000000000
     
00000000C2C3C3C4C4C4C5C5BABAD30000000000000000000000000000000000
     
00000000C2C3C3C4C4D1D1D1BAD3000000000000000000000000000000000000
     
00000000C2C3C3C4C4D1D1BAD300000000000000000000000000000000000000
     
00000000C2C3C4C4D1D1D1D30000000000000000000000000000000000000000
     
00000000C2C3C4C4D1D1D3000000000000000000000000000000000000000000
     
00000000C2C3C4D1D1BA00000000000000000000000000000000000000000000
     
00000000C2C4D1D1BA0000000000000000000000000000000000000000000000
     
00000000C2C4D1C5000000000000000000000000000000000000000000000000
     
00000000C2C5C500000000000000000000000000000000000000000000000000
     
00000000C2C50000000000000000000000000000000000000000000000000000
     
00000000D0000000000000000000000000000000000000000000000000000000
     
00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFC3FFFFF
      FC3FFFFFF87FFFFF787FFFFF30FFFFFF10FFFFFF01FFFFFF001FFFFF003FFFFF
     
007FFFFF00FFFFFF01FFFFFF03FFFFFF07FFFFFF0FFFFFFF1FFFFFFF3FFFFFFF
     
7FFFFFFF}
 
end
 
object lbEMail: TLabel
   
Left = 8
   
Top = 480
   
Width = 195
   
Height = 13
   
Caption = 'Кода Виктор, e-mail kodavic@rambler.ru'
   
Font.Charset = DEFAULT_CHARSET
   
Font.Color = clBlue
   
Font.Height = -11
   
Font.Name = 'MS Sans Serif'
   
Font.Style = []
   
ParentFont = False
 
end
 
object gb1: TGroupBox
   
Left = 360
   
Top = 8
   
Width = 129
   
Height = 145
   
Caption = 'Состояние мыши'
   
TabOrder = 0
   
object lbX0: TLabel
     
Left = 17
     
Top = 24
     
Width = 10
     
Height = 13
     
Caption = 'X:'
   
end
   
object lbY0: TLabel
     
Left = 17
     
Top = 40
     
Width = 10
     
Height = 13
     
Caption = 'Y:'
   
end
   
object lb1: TLabel
     
Left = 16
     
Top = 64
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка1:'
     
Enabled = False
   
end
   
object lb2: TLabel
     
Left = 16
     
Top = 80
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка2:'
     
Enabled = False
   
end
   
object lb3: TLabel
     
Left = 16
     
Top = 96
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка3:'
     
Enabled = False
   
end
   
object lbBtn1: TLabel
     
Left = 72
     
Top = 64
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn1'
     
Enabled = False
   
end
   
object lbBtn2: TLabel
     
Left = 72
     
Top = 80
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn2'
     
Enabled = False
   
end
   
object lbBtn3: TLabel
     
Left = 72
     
Top = 96
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn3'
     
Enabled = False
   
end
   
object lb4: TLabel
     
Left = 16
     
Top = 112
     
Width = 46
     
Height = 13
     
Caption = 'Кнопка4:'
     
Enabled = False
   
end
   
object lbBtn4: TLabel
     
Left = 72
     
Top = 112
     
Width = 30
     
Height = 13
     
Caption = 'lbBtn4'
     
Enabled = False
   
end
   
object lbX: TLabel
     
Left = 72
     
Top = 24
     
Width = 6
     
Height = 13
     
Caption = '0'
   
end
   
object lbY: TLabel
     
Left = 72
     
Top = 40
     
Width = 6
     
Height = 13
     
Caption = '0'
   
end
 
end
end

Взято с сайта Анатолия Подгорецкого  https://podgoretsky.com

по материалам fido7.ru.delphi.*