none
Comment faire fonctionner la webcam (code vb6 vers vbnet) ? RRS feed

  • Question

  • Bonjour,

    J'ai recopié un code vb6 qui fait tourner directement la webcam, sauf qu'il ne montre qu'une partie du plan.

    Retranscrit en vbNet, ce code lance le module de gestion de la caméra de mon PC (toshiba), ce qui avant ne se faisait pas (en vb6), mais ensuite, une fois ce dernier validé, plus rien ne s'affiche ?

    En fait ce code n'est pas de moi, je l'ai adapté jadis, je connias peu ces DLL et ce qu'elle font, il me semble que l'affichage passe par le presse-papier ? Je ne comprends rien !

    Voici le code :

    '
    ' webcam form 1
    ' OBJETS = form1 + timer1 + contextMenuStrip = 3
    Option Explicit On
    
    
    Public Class Form1
      Private Declare Function SetWindowPos Lib "User32" _
       (ByVal Handle As Int32, ByVal hWndInsertAfter As Int32, ByVal X As Int32, _
       ByVal Y As Int32, ByVal cx As Int32, ByVal cy As Int32, ByVal wFlags As Int32) As Int32
      '
      Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" ( _
        ByVal lpszWindowName As String, _
        ByVal dwStyle As Int32, _
        ByVal X As Int32, _
        ByVal Y As Int32, _
        ByVal nWidth As Int32, _
        ByVal nHeight As Int32, _
        ByVal hwndParent As Int32, _
        ByVal nID As Int32) As Int32
      '
      Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
        ByVal Handle As Int32, _
        ByVal wMsg As Int32, _
        ByVal wParam As Int32, _
        ByRef lParam As Int32) As Int32
      '
      Private Declare Sub ReleaseCapture Lib "User32" ()
      Const WM_NCLBUTTONDOWN = &HA1
      Const HTCAPTION = 2
      '
      Const WM_USER As Int32 = &H400
      Const WM_CAP_DRIVER_CONNECT As Int32 = WM_USER + 10
      Const WM_CAP_DRIVER_DISCONNECT As Int32 = WM_USER + 11
      Const WM_CAP_GRAB_FRAME As Int32 = WM_USER + 60
      Const WM_CAP_EDIT_COPY As Int32 = WM_USER + 30
      Const Flags = &H2 Or &H1 Or &H40 Or &H10
      '
      Dim iResult As Int32
      Dim Resultat As Int32
    
    
      Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Text = " Caméra"
        PremierPlanToolStripMenuItem.Checked = False
        ArrièrePlanToolStripMenuItem.Checked = True
        Timer1.Interval = 40
        Timer1.Enabled = True
        iResult = capCreateCaptureWindow("Capture", 0, 0, 0, PictureBox1.Width, PictureBox1.Height, Me.Handle, 0)
        SendMessage(iResult, WM_CAP_DRIVER_CONNECT, 0, 0)
      End Sub
    
    
      Sub PremierPlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PremierPlanToolStripMenuItem.Click
        PremierPlanToolStripMenuItem.Checked = True
        ArrièrePlanToolStripMenuItem.Checked = False
        TopMost = True
      End Sub
    
    
      Sub ArrièrePlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ArrièrePlanToolStripMenuItem.Click
        PremierPlanToolStripMenuItem.Checked = False
        ArrièrePlanToolStripMenuItem.Checked = True
        TopMost = False
      End Sub
    
    
      Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim limage As IDataObject = Clipboard.GetDataObject()
        Clipboard.Clear()
        SendMessage(iResult, WM_CAP_GRAB_FRAME, 0, 0)
        SendMessage(iResult, WM_CAP_EDIT_COPY, 0, 0)
        PictureBox1.Image = limage.GetData(DataFormats.Bitmap) ' Clipboard.GetData (vb6)
      End Sub
    
    
      Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button <> Windows.Forms.MouseButtons.Right Then Exit Sub
        ContextMenuStrip1.Show(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y)
      End Sub
    
    
      Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        SendMessage(iResult, WM_CAP_DRIVER_DISCONNECT, 0, 0)
        Resultat = SetWindowPos(Handle, -2, 0, 0, 0, 0, Flags)
      End Sub
    
    End Class
    

    Voici le programme en son dossier zipé (il est tout petit)

    http://mesromans.free.fr/wencam.zip

    Merci, au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 21 janvier 2013 10:04

Réponses

  • Bonjour Aurel Bera,

    A vrai dire, je ne vois pas trop l’intérêt de vérifier la valeur de retour de WM_CAP_DRIVER_DISCONNECT dans la mesure ou WM_CAP_DRIVER_CONNECT retourne la valeur 0, mais bon j'ai vérifié, et logiquement ça renvoie aussi 0. Dans les rares cas ou la webcam fonctionne, WM_CAP_DRIVER_CONNECT renvoie 1. Comme l' a indiqué EhJoe, le comportement est plutôt erratique et difficilement reproductible.

    Mais comme indiqué dans mon précédent message, est il bien pertinent et surtout pérenne d'utiliser  les API 'Video For Windows' actuellement ? alors que DirectShow semble lui même être amené à être remplacé par 'Media Foundation'.

    En partant d'un code trouvé sur CodeProject j'ai fini par avoir un truc qui fonctionne. Je dépose le projet sur cjoint

    Ca tourne sous Windows 7 et 8. Mes matériels sous XP n'ont pas de Webcam, et là ou j'ai une webcam, XP est en VM

    C'est loin d'être parfait, il y a du ménage à faire dans le code (VS 2005 à l'origine)

    PS : Merci pour les points sur un autre fil (Anniversaire :-) )


    Cordialement, Jacques

    • Marqué comme réponse EhJoe mercredi 30 janvier 2013 13:58
    mardi 29 janvier 2013 13:03

Toutes les réponses

  • Bonjour EhJoe

    J'ai testée exactement le code donne et il affiche bien.

    Testée avec un portable Dell, Windows 8 Entreprise, Visual Studio 2012.

    Essaye de chercher les derniers pilotes pour le webcam.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.



    mardi 22 janvier 2013 10:47
  • Bonsoir Aurel,

    Moi ça marche pas, ça plante sur cette instruction (dans le Load) :

    SendMessage(iResult, WM_CAP_DRIVER_CONNECT, 0, 0)

    Ce qui donne ceci :

    Et quoi je je fasse, la form s'affiche mais vide toujours...

    Je me demande si je mettais un pilote générique de Windows7 pour webcam ?

    Mais comment et où le trouver ?

    Sinon, je n'ai rien vu de spécial dans la BDR, je vais tenter de désinstaller le gestionnaire Toshiba de la web cam, normalement ça devrait comme les imprimantes être pris en compte comme générique (il date de juillet 2012) ?

    Par contre celui de vb6, le programme, qui est le même code, n'active pas les logiciels du fabricant ? Mais en vb6 je ne vois que le quart haut gauche de l'image...

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    mardi 22 janvier 2013 21:49
  • Bonjour EhJoe

    Dans la ligne SendMessage(iResult, WM_CAP_DRIVER_CONNECT, 0/*ici*/, 0)

    le troisième paramètre représente le ID du pilote, comme décrit ici :

    http://msdn.microsoft.com/fr-fr/library/windows/desktop/dd743891(v=vs.85).aspx

    Essayez de remplacer le 0 avec 1,2….9.

    Avec

    [      Private Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" ( _

                ByVal wDriverIndex As Integer, _

                ByVal lpszName As String, _

                ByVal cbName As Integer, _

                ByVal lpszVer As String, _

                ByVal cbVer As Integer) _

                As Boolean

            Public Shared _index As Integer

            Public Shared Function EnumCaptureDrivers() As List(Of String)

                Dim CaptureDriverIndex As Integer = 0

                Dim ptBuffer As String = Space(100)

                Const BufferLen As Integer = 100

                Dim ptDescription As String = Space(100)

                Dim Result As Boolean

                Dim TList As New List(Of String)

                Do

                    Result = capGetDriverDescription( _

                        CaptureDriverIndex, _

                        ptBuffer, _

                        BufferLen, ptDescription, BufferLen)

                    CaptureDriverIndex += 1

                    GetDeviceList._index = CaptureDriverIndex

                    If Result Then TList.Add(ptBuffer.Trim)

                Loop Until Result = False

                Return TList

            End Function

        End Class
    
    

    Pour avoir les pilotes installées (s’il y a plusieurs).

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 23 janvier 2013 10:22
  • Bonsoir Aurel,

    Je te remercie, je vois ça demain, et je reviens.

    Cordialement.

    mercredi 23 janvier 2013 20:16
  • Ah, je me suis trompé de pseudo, c'est moi OhMarielle, à supprimer...



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe jeudi 24 janvier 2013 07:46
    mercredi 23 janvier 2013 20:19
  • Bonjour Aurel,

    Oh là, trop compliqué pour moi !

    Dans ton code y a u  truc qui marche pas et je ne sais pas comment l'utiliser (voir en fin), voici tout le code :

    '
    ' webCam form1
    Option Explicit On
    Public Class Form1
      Dim param As Int32 = 0 ' 0 à l'origine
    
      Private Declare Function SetWindowPos Lib "User32" _
       (ByVal Handle As Int32, ByVal hWndInsertAfter As Int32, ByVal X As Int32, _
       ByVal Y As Int32, ByVal cx As Int32, ByVal cy As Int32, ByVal wFlags As Int32) As Int32
      '
      Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" ( _
        ByVal lpszWindowName As String, _
        ByVal dwStyle As Int32, _
        ByVal X As Int32, _
        ByVal Y As Int32, _
        ByVal nWidth As Int32, _
        ByVal nHeight As Int32, _
        ByVal hwndParent As Int32, _
        ByVal nID As Int32) As Int32
      '
      Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
        ByVal Handle As Int32, _
        ByVal wMsg As Int32, _
        ByVal wParam As Int32, _
        ByRef lParam As Int32) As Int32
      ' Aurel
      Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" ( _
        ByVal wDriverIndex As Integer, _
        ByVal lpszName As String, _
        ByVal cbName As Integer, _
        ByVal lpszVer As String, _
        ByVal cbVer As Integer) As Boolean
      '
      Private Declare Sub ReleaseCapture Lib "User32" ()
      Const WM_NCLBUTTONDOWN = &HA1
      Const HTCAPTION = 2
      '
      Const WM_USER As Int32 = &H400
      Const WM_CAP_DRIVER_CONNECT As Int32 = WM_USER + 10
      Const WM_CAP_DRIVER_DISCONNECT As Int32 = WM_USER + 11
      Const WM_CAP_GRAB_FRAME As Int32 = WM_USER + 60
      Const WM_CAP_EDIT_COPY As Int32 = WM_USER + 30
      Const Flags = &H2 Or &H1 Or &H40 Or &H10
      '
      Dim iResult As Int32
      Dim Resultat As Int32
      Public Shared _index As Integer
    
    
      Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Text = " Caméra"
        PremierPlanToolStripMenuItem.Checked = False
        ArrièrePlanToolStripMenuItem.Checked = True
        Timer1.Interval = 40
        Timer1.Enabled = True
        iResult = capCreateCaptureWindow("Capture", 0, 0, 0, PictureBox1.Width, PictureBox1.Height, Me.Handle, 0)
        SendMessage(iResult, WM_CAP_DRIVER_CONNECT, param, 0)
      End Sub
    
    
      Public Shared Function EnumCaptureDrivers() As List(Of String)
        Dim CaptureDriverIndex As Integer = 0
        Dim ptBuffer As String = Space(100)
        Const BufferLen As Integer = 100
        Dim ptDescription As String = Space(100)
        Dim Result As Boolean
        Dim TList As New List(Of String)
        Do
          Result = capGetDriverDescription(CaptureDriverIndex, ptBuffer, BufferLen, ptDescription, BufferLen)
          CaptureDriverIndex = CaptureDriverIndex + 1
          GetDeviceList._index = CaptureDriverIndex
          If Result Then TList.Add(ptBuffer.Trim)
        Loop Until Result = False
        Return TList
      End Function
    
    
      Sub PremierPlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PremierPlanToolStripMenuItem.Click
        PremierPlanToolStripMenuItem.Checked = True
        ArrièrePlanToolStripMenuItem.Checked = False
        TopMost = True
      End Sub
    
    
      Sub ArrièrePlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ArrièrePlanToolStripMenuItem.Click
        PremierPlanToolStripMenuItem.Checked = False
        ArrièrePlanToolStripMenuItem.Checked = True
        TopMost = False
      End Sub
    
    
      Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim limage As IDataObject = Clipboard.GetDataObject()
        Clipboard.Clear()
        SendMessage(iResult, WM_CAP_GRAB_FRAME, param, 0)
        SendMessage(iResult, WM_CAP_EDIT_COPY, param, 0)
        PictureBox1.Image = limage.GetData(DataFormats.Bitmap) ' Clipboard.GetData (vb6)
      End Sub
    
    
      Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button <> Windows.Forms.MouseButtons.Right Then Exit Sub
        ContextMenuStrip1.Show(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y)
      End Sub
    
    
      Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        SendMessage(iResult, WM_CAP_DRIVER_DISCONNECT, param, 0)
        Resultat = SetWindowPos(Handle, -2, 0, 0, 0, 0, Flags)
      End Sub
    
    End Class

    Dans ton code ici :

    Public Shared Function EnumCaptureDrivers() As List(Of String)
        Dim CaptureDriverIndex As Integer = 0
        Dim ptBuffer As String = Space(100)
        Const BufferLen As Integer = 100
        Dim ptDescription As String = Space(100)
        Dim Result As Boolean
        Dim TList As New List(Of String)
        Do
          Result = capGetDriverDescription(CaptureDriverIndex, ptBuffer, BufferLen, ptDescription, BufferLen)
          CaptureDriverIndex = CaptureDriverIndex + 1
          GetDeviceList._index = CaptureDriverIndex
          If Result Then TList.Add(ptBuffer.Trim)
        Loop Until Result = False
        Return TList
      End Function

    Cette instruction est refusée, peut être faut-il un objet ? :

    GetDeviceList._index = CaptureDriverIndex

    Erreur 1 'GetDeviceList' n'est pas déclaré. Il peut être inaccessible en raison de son niveau de protection. C:\Users\joe\Documents\Visual Studio 2012\Projects\WebCam\WebCam\Form1.vb 71 7 WebCam

    ***

    En outre, d'où et comment j'appelle et je lis ta fonction ?

    Merci, au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 24 janvier 2013 08:22
  • Ici vous avez le code complet:

     Public Class GetDeviceList
    
            'The capGetDriverDescription function retrieves the version description of the capture driver
            Private Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" ( _
                ByVal wDriverIndex As Integer, _
                ByVal lpszName As String, _
                ByVal cbName As Integer, _
                ByVal lpszVer As String, _
                ByVal cbVer As Integer) _
                As Boolean
    
            Public Shared _index As Integer
    
            Public Shared Function EnumCaptureDrivers() As List(Of String)
                Dim CaptureDriverIndex As Integer = 0
                Dim ptBuffer As String = Space(100)
                Const BufferLen As Integer = 100
                Dim ptDescription As String = Space(100)
                Dim Result As Boolean
                Dim TList As New List(Of String)
    
                Do
                    Result = capGetDriverDescription( _
                        CaptureDriverIndex, _
                        ptBuffer, _
                        BufferLen, ptDescription, BufferLen)
                    CaptureDriverIndex += 1
                    GetDeviceList._index = CaptureDriverIndex
                    If Result Then TList.Add(ptBuffer.Trim)
                Loop Until Result = False
                Return TList
            End Function
    
        End Class

    Et vous pouvez l’utiliser comme ça :

     Dim TList As List(Of String)
            Try
                TList = GetDeviceList.EnumCaptureDrivers()
                For Each Items As String In TList
                    Console.Write(Items)
                Next
                Me.Text = GetDeviceList._index.ToString()
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString(), "Info")
            End Try
     

    Son but est de afficher les pilotes installées pour choisir le bon à l’appel de SendMessage(iResult, WM_CAP_DRIVER_CONNECT, 0/*ici*/, 0)


    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.



    jeudi 24 janvier 2013 08:34
  • Aurel, suit...

    Marche pas, à cause de GetDevice... ça peut durer longtemps... je fais quoi avec ça, voici :

    Et le code :

    Option Explicit On
    Public Class Form1
      'The capGetDriverDescription function retrieves the version description of the capture driver
      Private Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" ( _
          ByVal wDriverIndex As Integer, _
          ByVal lpszName As String, _
          ByVal cbName As Integer, _
          ByVal lpszVer As String, _
          ByVal cbVer As Integer) _
          As Boolean
      Public Shared _index As Integer
    
    
      Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim TList As List(Of String)
        Try
          TList = GetDeviceList.EnumCaptureDrivers()
          For Each Items As String In TList
            Console.Write(Items)
          Next
          Me.Text = GetDeviceList._index.ToString()
        Catch ex As Exception
          MessageBox.Show(ex.Message.ToString(), "Info")
        End Try
      End Sub
    
    
      Public Shared Function EnumCaptureDrivers() As List(Of String)
        Dim CaptureDriverIndex As Integer = 0
        Dim ptBuffer As String = Space(100)
        Const BufferLen As Integer = 100
        Dim ptDescription As String = Space(100)
        Dim Result As Boolean
        Dim TList As New List(Of String)
    
        Do
          Result = capGetDriverDescription( _
              CaptureDriverIndex, _
              ptBuffer, _
              BufferLen, ptDescription, BufferLen)
          CaptureDriverIndex += 1
          GetDeviceList._index = CaptureDriverIndex
          If Result Then TList.Add(ptBuffer.Trim)
        Loop Until Result = False
        Return TList
      End Function
    
    End Class

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 24 janvier 2013 10:47
  • Il te manqué la definition de la classe:

    Public Class GetDeviceList

    Donc ton code sera:



    Option Explicit On Public Class Form1 'The capGetDriverDescription function retrieves the version description of the capture driver

    Public Class GetDeviceList

            'The capGetDriverDescription function retrieves the version description of the capture driver
            Private Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" ( _
                ByVal wDriverIndex As Integer, _
                ByVal lpszName As String, _
                ByVal cbName As Integer, _
                ByVal lpszVer As String, _
                ByVal cbVer As Integer) _
                As Boolean

            Public Shared _index As Integer

            Public Shared Function EnumCaptureDrivers() As List(Of String)
                Dim CaptureDriverIndex As Integer = 0
                Dim ptBuffer As String = Space(100)
                Const BufferLen As Integer = 100
                Dim ptDescription As String = Space(100)
                Dim Result As Boolean
                Dim TList As New List(Of String)

                Do
                    Result = capGetDriverDescription( _
                        CaptureDriverIndex, _
                        ptBuffer, _
                        BufferLen, ptDescription, BufferLen)
                    CaptureDriverIndex += 1
                    GetDeviceList._index = CaptureDriverIndex
                    If Result Then TList.Add(ptBuffer.Trim)
                Loop Until Result = False
                Return TList
            End Function

        End Class

    Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim TList As List(Of String) Try TList = GetDeviceList.EnumCaptureDrivers() For Each Items As String In TList Console.Write(Items) Next Me.Text = GetDeviceList._index.ToString() Catch ex As Exception MessageBox.Show(ex.Message.ToString(), "Info") End Try End Sub End Class

    En effet c'est une classe definie dans une autre classe.

    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.


    jeudi 24 janvier 2013 10:58
  • Bonjour Aurel,

    Ah ben, je ne savais pas qu'on pouvait mettre une classe dans une autre classe, moi en vb6 jamais je n'ai utilisé les classes, déjà une classe pour moi c'est de trop :o)

    Alors il me sort un seul pilote, ceci :

    Microsoft WDM Image Capture (Win32)

    Est-ce qu'il y a un moyen de lui passer textuellement le pilote

    SendMessage(iResult, WM_CAP_DRIVER_CONNECT, NOM_DU_PILOTE, 0)

    dans le paramétrage ?

    *

    Sinon, je suspecte, mais je peux me tromper, que le pilote du PC Toshiba prend la main en étant résident dès qu'un appel au pilote se produit en allant vers le processeur.

    S'il n'y a pas de solution sus-citée, je crois qu'il faudrait arriver à savoir quel est ce programme pour lui tordre le cou...

    Donc, sais-tu comment lister les services est processus qui résident ?

    Car ainsi je pourrai peut être cerner le nom du programme, car sans avoir son nom je ne vois pas comment l'inhiber...

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    vendredi 25 janvier 2013 10:12
  • J’ai trouvé des références qui indiquent que le problème apparaît parce que le Webcam
    est déjà utilisée :

    http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/ed1f0cab-5be7-4f44-a88c-b7fe5525c61e

    Si je me rappelle bien pour Toshiba il y a un logiciel qui fait le management du Webcam.

    Essaye de le fermer.

    Aussi, j’ai trouvé des références que le problème est résolu sous Windows 7 après une
    mise à jour des pilotes.



    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.


    • Modifié Aurel Bera vendredi 25 janvier 2013 12:32
    vendredi 25 janvier 2013 11:43
  • Bonjour EhJoe,

    Tu peux déjà regarder ce qu'indique le gestionnaire de phériphérique :

    Démarrer -> Exécuter -> devmgmt.msc

    Ici sur un Toshiba Satellite A660-1F5, mais j'ai désactivé un paquet d'utilitaires Toshiba :

    PS : est-il possible de charger un projet VB2012 dans VB2010 ?


    Cordialement, Jacques

    vendredi 25 janvier 2013 12:24
  • Les pilotes sont  de 2006  - essayez sur le site Toshiba de trouver une mise à jour.
    Quelle version de Windows avez-vous ?
    Si vous avez SP 1 pour Visual Studio 2010, vous pouvez utiliser le même projet avec VS 2012.
    Si non, le système va faire une transformation pour VS 2012.
    http://msdn.microsoft.com/fr-fr/library/vstudio/hh266747.aspx 


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 25 janvier 2013 12:31
  • Aurel,

    Oui, c'est ce que je subodore, y a un programme résident qui pique la main quand on évoque le système vidéo, faut avoir sa peau, quand on saura son nom...

    Heu, ne pas m'envoyer de liens en anglais, je ne comprends pas assez, et pour l'informatique la traduction laisse à désirer, vu que le langage c'est du parler de tous les jours...

    Jacque semble sur une piste intéressante, je vois aussi avec lui.

    Merci encore, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe vendredi 25 janvier 2013 16:42 rajout
    vendredi 25 janvier 2013 16:39
  • Bonjour Jacques,

    Merci de ta réponse.

    Alors je viens de regarder, j'ai exactement la même chose que tu as, sauf que moi y a pas marqué "Chicorny..." mais : "TOSHIBA Web Camera - HD"

    Mon mien c'est un Satellite L875.10 du 2 juillet 2012 (Seven 64 + 8 Go RAM + 1 To DD à 2,5 Ghz en 16/9 vrai 1600 * 900), tout est bien sauf le clavier pourri et dit MailleCroSoft une note basse à mon DD qui serait trop lent.

    J'ai fait comme toi, le ménage au début, sauf je j'ai dû mal le faire car il reste le programme de la webCam, a priori en résident, dont j'aimerais bien savoir comment lui faire passer l'arme à gauche, mais je ne connais pas son nom pour aller le chercher et supprimer l'exécutable sur DD et DD BDR ?

    A contrario je peux tout réinstaller, sauf que non ! Car à chaque fois il amène plein de pseudo-utilitaires mais vraies publicités, que sans doute comme toi j'ai voulu enlever. C'est pour ça que je ne suis pas pour tenter de réinstaller le truc, d'autant que (bis repetita), je ne connais pas son nom, et souvent en sus ce sont des sites anglais, et que je n'ai pas trouvé de forum en français qui ait du trafic et où je puisse être bien renseigné.

    Donc je veux désormais faire mon propre programme (photo, caméra et détection de mouvement par comparaison, heu... un seul à la fois ; que j'aurais eu la peau du programme résident.

    Au fait, sais-tu pourquoi il faut passer par le bloc-notes pour afficher les images, c'est ennuyeux ça, car évidemment on ne peut plus copier/coller, y aurait-il d'autres moyens ?

    Je ne sais pas si on peut mettre du 2012 dans le 10, le code sans doute, mais les ojets ?

    Alors si tu as une idée sur comment localiser ce gestionnaire (qui n'est pas le pilote je pense), afin de l'éradiquer, je suis toute ouie ?

    RAJOUT

    Je viens de lancer Messenger, ben il prend photos et vidéos sans problème, c'est donc la preuve qu'il doit y avoir une autre façon de programmer afin de contourner ce problème, mais je ne sais ?

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe vendredi 25 janvier 2013 19:55 rajout
    vendredi 25 janvier 2013 17:06
  • Aurel, je crois que mon pilote de 2006 est le bon, Jacque a le même, je ne crois pas que ce soit le pilote mais l'utilitaire Toshiba résident de la webcam qui prend la main, et qu'il faudrait supprimer si je savais son nom ?

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    vendredi 25 janvier 2013 17:09
  • Bonjour Aurel BERA,

    Sur le(s) site(s) de Toshiba on trouve des mises à jour, mais pour ce que j'ai vu cela ne concerne que l'application 'Toshiba Web Cam Appplication'. Le pilote n'est pas affecté (sous Windows 8 c'est identique : même pilote Microsoft de 2006, même version). La Webcam fonctionne avec cette application et avec Skype (6.1.73.129), ces deux applications détectant bien si la Webcam est libre ou pas. Par ailleurs il y a un voyant au niveau de la Webcam (bleu pour moi) indiquant son état; voyant qui ne s'allume pas avec les codes VB.Net que 'ai essayé.

    Version de Windows : Windows 7 Intégrale 64 bits avec le SP1 à jour des correctifs WU.

    Pour Visual Studio, ma question était un peu l'inverse : je dispose de la version Visual Studio 2010 Ultimate avec le SP1 (je bénéficiai à l'époque d'un abonnement MSDN Universal). EhJoe à posté un projet en VB2012 que je ne peux donc charger.

    Y a t-il une possibilité d'ouvrir ce projet sans écraser la 2010. Ultimate par une 2012 Express ? Installer cette dernière dans une VM ?


    Cordialement, Jacques

    dimanche 27 janvier 2013 07:34
  • Mon modèle est plus ancien (début 2011), d'où peut être une caméra différente ? Mais, en tout cas pour moi, à part le driver il n'y a pas de logiciel résident. L'application 'Toshiba Web Cam' se trouve dans :

    C:\Program Files (x86)\TOSHIBA\TOSHIBA Web Camera Application

    et se nomme : TWebCamera.exe

    regarde ma réponse à Aurel Bera, ça marche, avec Skype qui va remplacer Messenger aussi. Mais avec VB le voyant ne s'allume pas ...

    Pour les pilotes Toshiba en français c'est ici

    les forum sont uniquement en anglais.

    Pour ton modèle concernant la Webcam, il y a  : webcam-20120510133108.zip

    Mon modèle n'est pas concerné, je n'ai donc pas essayé.

    Sur le site anglais on trouve des versions différentes, mais les numéros de modèles ne correspondent pas à ceux utilisés en France :-( , c'est donc un peu au pif, je n'ai pas trouvé de tableau d'équivalence.

    Pour savoir de manière détaillé ce qui tourne il y a Process Explorer de Sysinternal

    Pour ma part je me limite à trouver la méthode pour activer la Webcam (allumer le voyant), le reste je verrai après ...



    Cordialement, Jacques

    dimanche 27 janvier 2013 08:09
  • Bonjour Jacques,

    Le plus fort c'est qu'au premier lancement du programme, après premier lancement du PC, ça marche UNE fois, le pseudo-gestionnjaire parasite reste inactif, voici une photo de ce matin :

    Avec ce code :

    '
    ' webCam form1
    Option Explicit On
    Public Class Form1
    
      Private Declare Function SetWindowPos Lib "User32" _
       (ByVal Handle As Int32, ByVal hWndInsertAfter As Int32, ByVal X As Int32, _
       ByVal Y As Int32, ByVal cx As Int32, ByVal cy As Int32, ByVal wFlags As Int32) As Int32
      '
      Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" ( _
        ByVal lpszWindowName As String, _
        ByVal dwStyle As Int32, _
        ByVal X As Int32, _
        ByVal Y As Int32, _
        ByVal nWidth As Int32, _
        ByVal nHeight As Int32, _
        ByVal hwndParent As Int32, _
        ByVal nID As Int32) As Int32
      '
      Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
        ByVal Handle As Int32, _
        ByVal wMsg As Int32, _
        ByVal wParam As Int32, _
        ByRef lParam As Int32) As Int32
      '
      Private Declare Sub ReleaseCapture Lib "User32" ()
      Const WM_NCLBUTTONDOWN = &HA1
      Const HTCAPTION = 2
      '
      Const WM_USER As Int32 = &H400
      Const WM_CAP_DRIVER_CONNECT As Int32 = WM_USER + 10
      Const WM_CAP_DRIVER_DISCONNECT As Int32 = WM_USER + 11
      Const WM_CAP_GRAB_FRAME As Int32 = WM_USER + 60
      Const WM_CAP_EDIT_COPY As Int32 = WM_USER + 30
      Const Flags = &H2 Or &H1 Or &H40 Or &H10
      '
      Dim iResult As Int32
      Dim Resultat As Int32
      Public Shared _index As Integer
    
    
      Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Text = " Caméra"
        PremierPlanToolStripMenuItem.Checked = False
        ArrièrePlanToolStripMenuItem.Checked = True
        Timer1.Interval = 40
        Timer1.Enabled = True
        iResult = capCreateCaptureWindow("Capture", 0, 0, 0, PictureBox1.Width, PictureBox1.Height, Me.Handle, 0)
        SendMessage(iResult, WM_CAP_DRIVER_CONNECT, 0, 0) ' L'APPLICATION TOSHIBA SE LANCE ICI
      End Sub
    
      
      Sub PremierPlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PremierPlanToolStripMenuItem.Click
        PremierPlanToolStripMenuItem.Checked = True
        ArrièrePlanToolStripMenuItem.Checked = False
        TopMost = True
      End Sub
    
    
      Sub ArrièrePlanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ArrièrePlanToolStripMenuItem.Click
        PremierPlanToolStripMenuItem.Checked = False
        ArrièrePlanToolStripMenuItem.Checked = True
        TopMost = False
      End Sub
    
    
      Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim limage As IDataObject = Clipboard.GetDataObject()
        Clipboard.Clear()
        SendMessage(iResult, WM_CAP_GRAB_FRAME, 0, 0)
        SendMessage(iResult, WM_CAP_EDIT_COPY, 0, 0)
        PictureBox1.Image = limage.GetData(DataFormats.Bitmap) ' Clipboard.GetData (vb6)
      End Sub
    
    
      Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button <> Windows.Forms.MouseButtons.Right Then Exit Sub
        ContextMenuStrip1.Show(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y)
      End Sub
    
    
      Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        SendMessage(iResult, WM_CAP_DRIVER_DISCONNECT, 0, 0)
        Resultat = SetWindowPos(Handle, -2, 0, 0, 0, 0, Flags)
      End Sub
    
    End Class

    RAJOUT : Je n'ai plus l'application, j'ai tout supprimé, peux*tu me renvoyer la tienne que je vois ?

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe dimanche 27 janvier 2013 08:59 rajout
    dimanche 27 janvier 2013 08:36
  • Bonjour EhJoe,

    Je suis parti du code : Webcam Picture

    qui donne :


    il y a aussi une video

    Pour le code supprimé, s'il s'agit de celui que tu as joint ici : Wencam en VB2012 (la faute de frappe n'est pas moi), tu peux l'y récupérer s'il y est encore.

    Mais pour le charger en VB2010, niet, apparemment certaines infos se trouvant dans le .sln ne plaisent pas.

    Sur ta capture écran c'est bien le voyant de la Webcam que l'on voit ? s'éteint il à la fermeture de programme ? se rallume t-il au lancement suivant ?


    Cordialement, Jacques

    dimanche 27 janvier 2013 10:02
  • Jacques,

    Ton code donne le même résultat, ça lance l'application de Toshiba.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    dimanche 27 janvier 2013 10:20
  • Petite précision sur le pilote de la webcam : je me demande où Windows va chercher cette date du 21/06/2006. En effet quand on clique sur 'Détails du pilote' on obtient :

    Détail du pilote :

    c:\windows\system32\drivers\ksthunk.sys   
    Description  : Kernel Streaming WOW Thunk Service
    Fournisseur : Microsoft Corporation
    Version        : 6.1.7600.16385 (win7_rtm.090713-1255)
    Date             : 14/07/2009 02:00:19

    c:\windows\system32\drivers\pgeffect.sys
    Description  : Toshiba Universal camera Filter Driver
    Fournisseur : Toshiba Corporation
    Version        : 1.0.17.64
    Date            : 08/02/2011 19:07:00

    c:\windows\system32\drivers\usbvideo.sys
    Description  : USB Video Class Driver
    Fournisseur : Microsoft Corporation
    Version        : 6.1.7601.17514 (win7sp1_rtm.101119-1850)
    Date            : 20/11/2010 20:44:36

    Le pilote pgeffects.dll (Pangu Effects Driver) est installé par l'utilitaire 'Web Camera Application' de Toshiba (version  2.0.0.35 pour moi) et peut être désinstallé (via le panneau de configuration), mais cela ne change rien.

    J'en finis par me demander si 'Video For Windows' (avicap32.dll) est encore vraiment fonctionnel sous Windows 7 64-bits. Beaucoup de discussions indiquent que jusqu'à XP c'est OK mais à partir de Vista ...

    Je regarde actuellement avec Direct Show, et là pas de problème pour afficher le flux de la webcam. Par contre pour enregistrer une capture, image ou vidéo, je sais pas faire


    Cordialement, Jacques


    • Modifié Jacques93 mardi 29 janvier 2013 10:38
    mardi 29 janvier 2013 10:35
  • Bonjour de nouveau
    SendMessage doit retourner un entier.
    Essaye de vérifier le résultat du  SendMessage(iResult, WM_CAP_DRIVER_DISCONNECT, 0, 0)
    dans Form_Closing.
    On peut même essayer SendMessage(iResult, WM_CAP_DRIVER_DISCONNECT, 0, 0) dans une boucle FOR, pour 10-100 fois.
    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 29 janvier 2013 11:52
  • Bonjour Aurel Bera,

    A vrai dire, je ne vois pas trop l’intérêt de vérifier la valeur de retour de WM_CAP_DRIVER_DISCONNECT dans la mesure ou WM_CAP_DRIVER_CONNECT retourne la valeur 0, mais bon j'ai vérifié, et logiquement ça renvoie aussi 0. Dans les rares cas ou la webcam fonctionne, WM_CAP_DRIVER_CONNECT renvoie 1. Comme l' a indiqué EhJoe, le comportement est plutôt erratique et difficilement reproductible.

    Mais comme indiqué dans mon précédent message, est il bien pertinent et surtout pérenne d'utiliser  les API 'Video For Windows' actuellement ? alors que DirectShow semble lui même être amené à être remplacé par 'Media Foundation'.

    En partant d'un code trouvé sur CodeProject j'ai fini par avoir un truc qui fonctionne. Je dépose le projet sur cjoint

    Ca tourne sous Windows 7 et 8. Mes matériels sous XP n'ont pas de Webcam, et là ou j'ai une webcam, XP est en VM

    C'est loin d'être parfait, il y a du ménage à faire dans le code (VS 2005 à l'origine)

    PS : Merci pour les points sur un autre fil (Anniversaire :-) )


    Cordialement, Jacques

    • Marqué comme réponse EhJoe mercredi 30 janvier 2013 13:58
    mardi 29 janvier 2013 13:03
  • Bonjour Jacques et Aurel,

    Jacques : A ben enfin un truc qui tourne. Je ne me sens pas capable de faire un grand ménage, mais un petit si, en adaptant à la taille de l'écran notamment, en voyant de même comment c'est enregistré pour en tirer des comparaison par image, ou des photographies.

    Je me disais bien qu'il y avait d'autres moyens, car j'ai eu un pseudo-virus qui m'a photographié sans problème, Messenger aussi tourne sans problème, donc logiquement il y avait d'autres solutions...

    Merci à vous, on va dire que c'est clos pour le moment, ça devrait suffire.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    mercredi 30 janvier 2013 13:58
  • Pour adapter la taille, ce devrait être assez simple : la fenêtre de capture est redimensionnée de façon dynamique en fonction de la taille de la fenêtre principale. Par contre, je n'ai pas mis de contrôle pour rester dans des tailles "raisonnables".

    Enfin cela n'explique pas pourquoi ça ne fonctionne pas correctement avec avicap32.dll et vb.NET.Comme indiqué dans le fil je n'ai pas pu regarder sous XP.

    Une réponse pourrait peut être se trouver dans le code de VirtualDub qui fonctionne au choix avec DirectShow ou Video for Windows, mais le code en C++ est assez coton ... 


    Cordialement, Jacques

    mercredi 30 janvier 2013 15:19