Я нашёл шикарный код, вот он работает так с помощью тела можно перемещать мышку, давайте что нибудь придумаем все вместе на этой основе
#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_USER + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_USER + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_USER + 25
#WM_CAP_SET_SCALE = #WM_USER + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
Structure VIDEOHDR
lpData.l
dwBufferLength.l
dwBytesUsed.l
dwTimeCaptured.l
dwUser.l
dwFlags.l
dwReserved.l[3]
EndStructure
Structure CAPSTATUS
uiImageWidth.l
uiImageHeight.l
fLiveWindow.l
fOverlayWindow.l
fScale.l
ptScroll.Point
fUsingDefaultPalette.l
fAudioHardware.l
fCapFileExists.l
dwCurrentVideoFrame.l
dwCurrentVideoFramesDropped.l
dwCurrentWaveSamples.l
dwCurrentTimeElapsedMS.l
hPalCurrent.l
fCapturingNow.l
dwReturn.l
wNumVideoAllocated.l
wNumAudioAllocated.l
EndStructure
CompilerIf #PB_Compiler_Unicode = 0
Import "avicap32.lib"
capCreateCaptureWindow.l(name.s, style.l, x.l, y.l, width.l, height.l, hWndParent.l, nId.l) As "_capCreateCaptureWindowA@32"
capGetDriverDescription.l(index.l, name.l, cbName.l, ver.l, cbVer.l) As "_capGetDriverDescriptionA@20"
EndImport
CompilerElse
Import "avicap32.lib"
capCreateCaptureWindow.l(name.s, style.l, x.l, y.l, width.l, height.l, hWndParent.l, nId.l) As "_capCreateCaptureWindowW@32"
capGetDriverDescription.l(index.l, name.l, cbName.l, ver.l, cbVer.l) As "_capGetDriverDescriptionW@20"
EndImport
CompilerEndIf
ExamineDesktops()
; Macro GetColorXY(DataPointer, PixelX, PixelY, ImageWidth, ImageHeight)
; PeekL(DataPointer + ((ImageHeight - PixelY) * ImageWidth + PixelX) * 3) & $00FFFFFF
; EndMacro
Structure SBGR
b.b
g.b
r.b
EndStructure
Global *oldMem.BYTE, oldPosX, oldPosY, made
*oldMem = AllocateMemory(320 * 240 * 3)
made = 0
CreateImage(0, 320, 240)
Procedure FrameCallback(hWnd.l, *lpVHdr.VIDEOHDR)
Protected *VideoMemoryAdress1.SBGR = *lpVHdr\lpData
Protected *VideoMemoryAdress2.SBGR = *oldMem
Protected leftred1, leftred2, leftgreen1, leftgreen2, leftblue1, leftblue2
Protected red1, red2, green1, green2, blue1, blue2
Protected density1, density2
Protected maxChange, change
Protected posX, posY
If made <= 0
CopyMemory(*lpVHdr\lpData, *oldMem, 320 * 240 * 3)
made = 1
EndIf
maxChange = 0
For y = 240 - 1 To 0 Step -1
blue1 = *VideoMemoryAdress1\b & $FF
green1 = *VideoMemoryAdress1\g & $FF
red1 = *VideoMemoryAdress1\r & $FF
blue2 = *VideoMemoryAdress2\b & $FF
green2 = *VideoMemoryAdress2\g & $FF
red2 = *VideoMemoryAdress2\r & $FF
*VideoMemoryAdress1 + 3
*VideoMemoryAdress2 + 3
For x = 320 - 1 To 1 Step -1
leftblue1 = blue1
leftgreen1 = green1
leftred1 = red1
leftblue2 = blue2
leftgreen2 = green2
leftred2 = red2
blue1 = (*VideoMemoryAdress1\b & $FF + leftblue1) * 0.5
green1 = (*VideoMemoryAdress1\g & $FF + leftgreen1) * 0.5
red1 = (*VideoMemoryAdress1\r & $FF + leftred1) * 0.5
blue2 = (*VideoMemoryAdress2\b & $FF + leftblue2) * 0.5
green2 = (*VideoMemoryAdress2\g & $FF + leftgreen2) * 0.5
red2 = (*VideoMemoryAdress2\r & $FF + leftred2) * 0.5
density1 = (red1 + green1 + blue1) * 0.3333
density2 = (red2 + green2 + blue2) * 0.3333
change = Pow(density2 - density1, 2) * 0.1
*VideoMemoryAdress1\b = change
*VideoMemoryAdress1\g = *VideoMemoryAdress1\b
*VideoMemoryAdress1\r = *VideoMemoryAdress1\b
; change * (320 * 320 + 240 * 240) * 3 / (Pow(x - oldPosX, 2) + Pow(y - oldPosY, 2))
If maxChange < change
maxChange = change
posX = x
posY = y
EndIf
*VideoMemoryAdress1 + 3
*VideoMemoryAdress2 + 3
Next x
Next y
posX = Int((DesktopWidth(0) / (320.0 * 2)) * posX) * 2
posY = Int((DesktopHeight(0) / (240.0 * 2)) * posY) * 2
*VideoMemoryAdress1 = *lpVHdr\lpData
StartDrawing(ImageOutput(0))
For y = 240 - 1 To 0 Step -1
For x = 0 To 320 - 1
Plot(x, y, RGB(*VideoMemoryAdress1\r & $FF, *VideoMemoryAdress1\g & $FF, *VideoMemoryAdress1\b & $FF))
*VideoMemoryAdress1 + 3
Next
Next
StopDrawing()
If maxChange > 130
posX = oldPosX + (posX - oldPosX) * 0.25
posY = oldPosY + (posY - oldPosY) * 0.25
SetWindowTitle(0, Str(posX) + ":" + Str(posY))
SetCursorPos_(posX, posY)
oldPosX = posX
oldPosY = posY
EndIf
EndProcedure
hWnd = OpenWindow(0, 0, 0, 640, 480, "Touchpad", #PB_Window_SystemMenu)
hWebcam = capCreateCaptureWindow("Bradan.Eu - Touchpad", #WS_VISIBLE | #WS_CHILD, 0, 0, 640, 480, hWnd, 0)
SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT , 0, 0)
SendMessage_(hWebcam, #WM_CAP_SET_SCALE , 1, 0)
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEWRATE , 10, 0)
SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW , 1, 0)
SendMessage_(hWebcam, #WM_CAP_SET_CALLBACK_FRAME , 0, @FrameCallback())
Repeat
Until WaitWindowEvent(3) = #PB_Event_CloseWindow
End