1,183
社区成员
发帖
与我相关
我的任务
分享
var
h:HDC;
h2:HPEN;
bmp:windows.HBITMAP;
begin
h:=CreateCompatibleDC(GetDC(GetDesktopWindow));
bmp:=CreateCompatibleBitmap(h,200,200);
SelectObject(h,Bmp);
SetBkColor(h,$ffffff);
SetBkMode(h,TRANSPARENT);
h2:=CreatePen(PS_SOLID, 2, $ffffff);
SelectObject(h,h2);
MoveToEx(h,0,0,nil);
LineTo(h,100,200);
BitBlt(self.Canvas.Handle,0,0,200,200,h,0,0,SRCCOPY);
//鼠标
function DirectInputMouse(lpDInput :IDirectInput8W; h_wnd :THandle; out lpDInputMouse :IDirectInputDevice8W) :HRESULT;
var
DIPropDWord:TDIPropDWord;
begin
Result:= E_FAIL;
if Failed(lpDInput.CreateDevice(GUID_SysMouse, lpDInputMouse, nil)) then exit;
if Failed(lpDInputMouse.SetCooperativeLevel(h_wnd, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND)) then exit;
DIPropDWord.diph.dwHeaderSize:= sizeof(TDIPropHeader);
DIPropDWord.diph.dwSize := sizeof(TDIPropDWord);
DIPropDWord.diph.dwHow := DIPH_DEVICE;
DIPropDWord.diph.dwObj := 0;
DIPropDWord.dwData := BUFFER_SIZE;
if Failed(lpDInputMouse.SetProperty(DIPROP_BUFFERSIZE, DIPropDWord.diph)) then exit;
if Failed(lpDInputMouse.SetDataFormat(c_dfDIMouse2)) then exit;
result:=S_Ok;
end;
var
DInput :IDirectInput8W;
DInputMouse :IDirectInputDevice8W;//鼠标输入
begin
DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8W, DInput, nil);
DirectInputMouse(DInput, DDrawMode.WinHandle, DInputMouse);
...
...
//处理鼠标
if not (DInputMouse=nil) then begin
if Failed(DInputMouse.GetDeviceState(Sizeof(TDIMouseState2),@MouseState)) then begin
DInputMouse.Acquire;
DInputMouse.GetDeviceState(Sizeof(TDIMouseState2),@MouseState);
end;
// MouseState.lX
// MouseState.lY
end;
end;
var
guidInstance: TGUID;
function DIEnumDevicesCallbackW(var lpddi: TDIDeviceInstanceW; pvRef: Pointer): BOOL; stdcall;
var
tmpDInput :IDirectInput8W;
tmpDInputJoy :IDirectInputDevice8W;
begin
result:=False;
if Failed(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8W, tmpDInput, nil)) then exit;
result:=Succeeded(tmpDInput.CreateDevice(lpddi.guidInstance, tmpDInputJoy, nil));
guidInstance:=lpddi.guidInstance;
tmpDInputJoy:=nil;
tmpDInput:=nil;
end;
function DirectInputJoy(lpDInput :IDirectInput8W; h_wnd :THandle; out lpDInputJoy :IDirectInputDevice8W) :HRESULT;
var
DIPropRange:TDIPropRange;
DIPropDWord:TDIPropDWord;
begin
Result:= E_FAIL;
if Failed(lpDInput.EnumDevices(DI8DEVTYPE_JOYSTICK,DIEnumDevicesCallbackW,nil,DIEDFL_ATTACHEDONLY)) then exit;
if Failed(lpDInput.CreateDevice(guidInstance, lpDInputJoy, nil)) then exit;
if Failed(lpDInputJoy.SetCooperativeLevel(h_wnd, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND)) then exit;
//手柄范围
DIPropRange.diph.dwSize := sizeof(TDIPropRange);
DIPropRange.diph.dwHeaderSize := sizeof(TDIPropHeader);
DIPropRange.diph.dwHow := DIPH_DEVICE;
DIPropRange.diph.dwObj := 0;
DIPropRange.lMax := 100;
DIPropRange.lMin := -100;
if Failed(lpDInputJoy.SetProperty(DIPROP_RANGE,DIPropRange.diph)) then exit;
//中心死区
DIPropDWord.diph.dwSize :=sizeof(TDIPropDWord);
DIPropDWord.diph.dwHeaderSize:=sizeof(TDIPropHeader);
DIPropDWord.diph.dwHow :=DIPH_DEVICE;
DIPropDWord.diph.dwObj :=0;
DIPropDWord.dwData :=1000;
if Failed(lpDInputJoy.SetProperty(DIPROP_RANGE,DIPropRange.diph)) then exit;
if Failed(lpDInputJoy.SetDataFormat(c_dfDIJoystick2)) then exit;
result:=S_OK;
end;
//使用
var
DInput :IDirectInput8W; //DirectInput对象
DInputJoy :IDirectInputDevice8W;//手柄输入
JoyState :TDIJoyState2;
begin
//建立DirectInput
if not (DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8W, DInput, nil)=DD_OK) then exit;
DirectInputJoy(DInput, MainHandle, DInputJoy);
//处理手柄事件
if not (DInputJoy=nil) then begin
if not (DInputJoy.GetDeviceState(sizeof(TDIJoyState2),@JoyState)=DD_OK) then
DInputJoy.Acquire;
//对应上下左右
// JoyState.lX
// JoyState.lX
// JoyState.lY
// JoyState.lY
end;
//释放
if not (DInputJoy=nil) then
try DInputJoy.Unacquire;
finally DInputJoy :=nil;
end;
DInput :=nil;
end;