Seite 1 von 1

webcam bereits aktiv ?

Verfasst: 12.06.2009 11:53
von difroso
Hallo Mitstreiter,
ich habe nun seit einiger Zeit PureBasic, bin inzwischen auch begeisterter Anhänger. Bisher konnte ich mich mit Fragen zurückhalten, die Foren haben ja eine sehr hohe Abdeckung des "HowTo" in fast allen Bereichen.

Aber nun zu einer Frage, die ich trotz intensiverer Recherchen nicht beantwortet bekommen habe:

Ich habe das "klassische" Problem "Anzeige einer Webcam" / Speichern eines Bildes umgesetzt und das funktioniert auch.
Wenn aber die Webcam in Benutzung ist, möchte ich dem "Anwender" eine Fehlermeldung in der Art geben "Webcam wird zur Zeit von einem anderen Programm benutzt"

Und genau das festzustellen will mir nicht gelingen... Übersehe ich da etwas simples ? Muss man vielleicht sogar das Gerät physisch selber ansprechen, um die Info zu bekommen ?

Für Eure Mühe im Voraus vielen Dank!

Code: Alles auswählen


UseJPEGImageEncoder()
UseJPEGImageDecoder()

#WM_CAP_START = #WM_USER
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_STOP = #WM_CAP_START + 68
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_GRAP_FRAME = #WM_CAP_START + 60


Global sn.l
Global hWndC.l

hwnd.l=OpenWindow(#Window_0, 0, 0, 0, 0, "camshot", #PB_Window_SystemMenu |  #PB_Window_MinimizeGadget     )
HideWindow(0, 1)    
   

 
  If OpenLibrary(0, "avicap32.dll")
    *capAddress = GetFunction(0, "capCreateCaptureWindowA")
   
    hWndC.l = CallFunctionFast(*capAddress, "cw", #WS_CHILD | #WS_VISIBLE, 50,38, 310, 230, WindowID(0),0)
    SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEW, #True, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEWRATE, 1, 0)
    SendMessage_(hWndC, #WM_CAP_SET_SCALE, #True, 0)

; hier liegt das problem
; der kriegt nämlich immer ein bild, auch wenn die cam in benutzung ist
; eine abfrage a la sendmessage_(hwndc, #wm_is_cam_active) gibts nicht ...
;
          SendMessage_(hWndC.l, #WM_CAP_GRAP_FRAME, 1, 0)
          SendMessage_(hWndC.l, #WM_CAP_EDIT_COPY, 0, 0)
 
          sn.l = GetClipboardImage(#PB_Any)
          If sn.l             
            saver$="x.jpg"
            SaveImage(sn.l,saver$,#PB_ImagePlugin_JPEG,10)
            FreeImage(sn.l)
          EndIf
          ClearClipboard()
   
  EndIf
  
          SendMessage_(hWndC, #WM_CAP_STOP, 0, 0)
          SendMessage_(hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
          DestroyWindow_(hWndC)
          CloseLibrary(0)

End 

Verfasst: 16.06.2009 12:44
von difroso
hallo wieder,
wie mir scheint, hat auch niemand eine idee ... also ich habe zwischenzeitlich noch weiter recherchiert; finde aber in der tat keine hinweise zu dem beschriebenen problem.

in der msdn habe ich etwas gefunden zu einem status der heißt

ioctl_internal_usb_get_port_status

aber ehrlich gesagt habe ich keinen blassen schimmer, ob wie und wobei mir das helfen könnte...
falls noch irgendwer eine interessante idee hätte würde ich mich freuen. meine derzeitige lösungsidee:
nen bild machen und schauen obs genauso aussieht wie das was man macht wenn die kamera nicht verfügbar ist...dann isse wohl besetzt

Verfasst: 01.09.2009 14:23
von gpphjs
hallo,
die Sache ist recht einfach: Der Befehl #WM_CAP_DRIVER_CONNECT gibt #True oder #False zurück.
Also

Code: Alles auswählen

hWnd = OpenWindow(0, 0, 0, 1000, 600, "SandCam_COM", #PB_Window_SystemMenu)

                    
If OpenLibrary(0, "AVICAP32.DLL")
  hWebcam = CallFunction(0, "capCreateCaptureWindowA", "BLUBBER", #WS_VISIBLE + #WS_CHILD, 10, 30, 320, 240, hWnd, 0)

 
 If SendMessage_(hWebcam, #WM_CAP_DRIVER_CONNECT          , 0 , 0)  ; connect driver, KameraID.l=0
 Else
  MessageRequester("Webcam","Webcam ist in Benutzung oder nicht angeschlossen")
 EndIf
  SendMessage_(hWebcam, #WM_CAP_SET_PREVIEW       , 0, 0)
  SendMessage_(hWebcam, #WM_CAP_DRIVER_DISCONNECT, "BLUBBER", 0)
  CloseWindow(0)
  CloseLibrary(0)
 
Else
 MessageRequester("Meldung","AVICAP32.DLL konnte nicht geladen werden")
EndIf
End
Wenn schon eine Webcam angeschlossen ist, meldet sich bei mir der ensprechende Treiber andernfalls kommt die Meldung. Ist eine Webcam dran, passiert nix, da muss dann dein code rein.
Alle anderen Video Capture Messages funktionieren genauso (
http://msdn.microsoft.com/en-us/library ... .85).aspx)