Lu'
Bon, vu la galère (clic droit inopérant sur la webcam), je suis revenu à mes débuts.
Et voici ce que j'ai fait :
► Afficher le texte
#AutoIt3Wrapper_UseX64=n#include <Misc.au3>#include <Memory.au3>#include <GUIConstantsEx.au3>#include <WindowsConstants.au3>#include <StaticConstants.au3>#include <array.au3>#include <GuiComboBox.au3>#include "WebcamDS_UDF.au3"#include <SendMessage.au3>#include <ScreenCapture.au3>#include <WinAPISysWin.au3>Global $affichage = 0Global $devcon = "devcon_x64.exe"Global Const $SC_DRAGMOVE = 0xF012Global $QuitterGlobal $UserDLL = DllOpen("user32.dll")Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc")Global $hComboCam = '', $hComboComp = '', $hComboMic, $ZoomInput = ''_WebcamDS_Init
()Global $hGUI = GUICreate("DirectShow Capture", 640, 480, 0, 0, $WS_POPUP + $WS_SIZEBOX)GUISetBkColor(0xFFFFFF)$affwc = GUICtrlCreateButton("Afficher / Masquer la webcam", 0, 0, 180, 20)GUICtrlCreateLabel("", 185, 0, 1,20, $SS_SUNKEN) ;separator$wc_0 = GUICtrlCreateButton("Désactiver la webcam", 190, 0, 140, 20)GUICtrlCreateLabel("", 335, 0, 1,20, $SS_SUNKEN) ;separator$wc_1 = GUICtrlCreateButton("Activer la webcam", 340, 0, 140, 20)GUICtrlCreateLabel("", 485, 0, 1,20, $SS_SUNKEN) ;separator$capt = GUICtrlCreateButton("Capturer l'image",490, 0, 110, 20)GUICtrlCreateLabel("", 605, 0, 1,20, $SS_SUNKEN) ;separatorGlobal $Quitter = GUICtrlCreateButton("X", 610, 0, 25, 20)GUISetState(@SW_SHOW)Global $msg, $hgui2, $cld = 0While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Or $msg = $Quitter Exit Case $msg = $GUI_EVENT_PRIMARYDOWN _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0) Case $msg = $affwc If $affichage = 0 Then Global $WC = _WebcamDS_RenderWebcam
(1, 1, $hGUI, 1, 640, 480, 24, 0, 0, 0, 0) $affichage = 1 Else _WebcamDS_Init
() $affichage = 0 EndIf Case $msg = $capt $imgcapt = @ScriptDir & "\capt_wc.jpg" FileDelete($imgcapt) _ScreenCapture_CaptureWnd($imgcapt, $hGUI, 0, 42.5) ShellExecute($imgcapt) Case $msg = $GUI_EVENT_RESIZED _WebcamDS_Init
() Global $pos = WinGetPos($hGUI) GUISetState($hGUI, @SW_HIDE) Global $NLargeur = $pos[2] - 20 Global $NHauteur = $pos[3] - 40 GUISetState($hGUI, @SW_SHOW) _WebcamDS_RenderWebcam
(1, 1, $hGUI, 1, $NLargeur, $NHauteur, 24, 0, 0, 0, 0) EndSelectWEnd
Ce qui fonctionne :
Afficher la webcam = c'est fait
Redimensionner la fenêtre ET la webcam = c'est fait
Capturer l'image de la webcam = c'est fait
Par contre, je veux aussi pouvoir activer et désactiver la webcam.
Ca c'est fait...
Par contre, si la webcam est désactivé, l'UDF Webcam que j'utilise, ne fonctionne pas.
J'obtiens une erreur.
Et donc, le script s'arrête.
je voudrais bien qu'il continue, puisque je pourrais par la suite activer la webcam.
Comment faire ?
L'UDF en question :
https://www.autoitscript.com/forum/topi ... ow-webcam/
L'erreur que j'obtiens :
"C:\Users\tomce\Desktop\WebcamSwitch\WebcamDS UDF\WebcamDS_UDF.au3" (494) : ==> Variable must be of type "Object".:
While $oEnum.Next(1, $pMoniker, 0) = $S_OK
While $oEnum^ ERROR
Elle se trouve dans la fonction _WebcamDS_enumerateDevices (normal puisque la webcam étant désactivée, il n'y en a aucune).
► Afficher le texte
Func _WebcamDS_EnumerateDevices($CLSID_category, $argument = 99)
; Create a helper object To find the capture device.
$oDevEnum = ObjCreateInterface($sCLSID_SystemDeviceEnum, $sIID_ICreateDevEnum, $tagICreateDevEnum)
Local $pEnum = 0
$oDevEnum.CreateClassEnumerator($CLSID_category, $pEnum, 0)
$oEnum = ObjCreateInterface($pEnum, $sIID_IEnumMoniker, $tagIEnumMoniker)
Local $iPosition = '', $arg = ''
If StringInStr($CLSID_category, "860bb310") Or StringInStr($CLSID_category, "33d9a762") Then ; VideoInputDevice or Audio
$iPosition = $argument
$arg = ''
Else ; data for compressor
$iPosition = ''
$arg = $argument
EndIf
Local $pMoniker, $oMoniker, $hr
Local $i = 1, $pBindObj[99]
While $oEnum.Next(1, $pMoniker, 0) = $S_OK
Local $pPropBag, $oPropBag
$oMoniker = ObjCreateInterface($pMoniker, $sIID_IMoniker, $tagIMoniker)
$oMoniker.BindToObject(0, 0, $sIID_IBaseFilter, $pBindObj[$i])
$hr = $oMoniker.BindToStorage(0, 0, $sIID_IPropertyBag, $pPropBag)
$oPropBag = ObjCreateInterface($pPropBag, $sIID_IPropertyBag, $tagIPropertyBag)
Local $var = ''
$oPropBag.Read("FriendlyName", $var, 0)
; ConsoleWrite('>> FriendlyMoniker' & $i & ': ' &$var& @CRLF)
If $iPosition = 99 Then
If StringInStr($CLSID_category, "33d9a762") Then; list mics
If $var <> '' Then
$aMicList[$i] = $var
EndIf
Else ; list webcams
If $var <> '' Then
$aWebcamList[$i] = $var
EndIf
EndIf
Local $oCaptureTemp = ObjCreateInterface($pBindObj[$i], $sIID_IBaseFilter, $tagIBaseFilter)
$oCaptureTemp = 0
; create oCaptureTemp otherwise with some webcams (Philips) gives error at the end of script ????
; ---------------------------
; ASSERT Failed
; ---------------------------
; Executable: autoit3.exe Pid 17dc Tid 768. Module CamExt40V32.ax, 2 objects left active!
; At line 320 of f:\dev64\dsdll\dllentry.cpp
; Continue? (Cancel to debug)
; ---------------------------
EndIf
If $iPosition = '' And $arg = 99 Then
; list of compressor
If $var <> '' Then
$aCompressorList[$i] = $var
EndIf
EndIf
If ($iPosition <> '' And $iPosition = $i) Or ($arg <> '' And $var = $arg) Then
; ConsoleWrite('------found'&@CRLF)
If ($iPosition = '' And $arg = $var) Then ;
If Not IsObj($oCompressor) Then
$oCompressor = ObjCreateInterface($pBindObj[$i], $sIID_IBaseFilter, $tagIBaseFilter)
EndIf
; Add the compressor filter To the filter graph
$hr = $oGraph.AddFilter($oCompressor, "Compressor" & $iWebcam)
ExitLoop
EndIf
If ($iPosition <> '' And $iPosition = $i) Then
If StringInStr($CLSID_category, "33d9a762") Then ; è l'audio
If Not IsObj($oCaptureAudio) Then
$oCaptureAudio = ObjCreateInterface($pBindObj[$i], $sIID_IBaseFilter, $tagIBaseFilter)
ConsoleWrite($iWebAudio & 'capAu:' & $i & @CRLF)
EndIf
; Add the captureAudio filter To the filter graph
$hr = $oGraph.AddFilter($oCaptureAudio, $var)
Else
If Not IsObj($oCapture[$iPosition]) Then
$oCapture[$iPosition] = ObjCreateInterface($pBindObj[$i], $sIID_IBaseFilter, $tagIBaseFilter)
EndIf
; Add the captureVideo filter To the filter graph
$hr = $oGraph.AddFilter($oCapture[$iPosition], "CaptureFilter" & $iWebcam)
WinSetTitle($hGUI, '', $var)
EndIf
ExitLoop
EndIf
EndIf
$oPropBag = 0
$i += 1
WEnd
; _ArrayDisplay($aCompressorList)
If $iPosition = 99 And StringInStr($CLSID_category, "33d9a762") Then $aMicList[0] = $i - 1
If $iPosition = 99 And StringInStr($CLSID_category, "860bb310") Then $aWebcamList[0] = $i - 1
If $iPosition = '' And $arg = 99 Then
$aCompressorList[$i] = 'Uncompressed'
$aCompressorList[0] = $i - 1
EndIf
$oMoniker = 0
$oEnum = 0
$oDevEnum = 0
EndFunc ;==>_WebcamDS_enumerateDevices
Pouvez-vous m'aider ?
Merci