none
想用c#程式設計控制筆記本攝像頭,代碼編譯通過,運行不報錯,就是沒有效果 RRS feed

  • 問題

  • 攝像頭:

     public class Cams
        {
            [DllImport("avicap32.dll")]
            public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
            [DllImport("avicap32.dll")]
            public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);
            [DllImport("User32.dll")]
            public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
            [DllImport("User32.dll")]
            public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);
            [DllImport("User32.dll")]
            public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);
          
            [DllImport("User32.dll")]
            public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
            [DllImport("avicap32.dll")]
            public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
     
            // Constants
            public const int WM_USER = 0x400;
            public const int WS_CHILD = 0x40000000;
            public const int WS_VISIBLE = 0x10000000;
            public const int SWP_NOMOVE = 0x2;
            public const int SWP_NOZORDER = 0x4;
            public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;
            public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;
            public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;
            public const int WM_CAP_SET_PREVIEW = WM_USER + 50;
            public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;
            public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;
     
     
     
            public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);
     

          
        }

    攝像頭操作:

     class CamsController
        {
            // delegate for frame callback
            public delegate void RecievedFrameEventHandler(byte[] data);
     
            private IntPtr lwndC; // Holds the unmanaged handle of the control
            private IntPtr mControlPtr; // Holds the managed pointer of the control
            private int mWidth;
            private int mHeight;
     
            public CamsController(IntPtr handle, int width, int height)
            {
                mControlPtr = handle;
                mWidth = width;
                mHeight = height;
            }
     
            // private functions
            private bool capDriverConnect(IntPtr lwnd, short i)
            {
                return Cams.SendMessage(lwnd, Cams.WM_CAP_DRIVER_CONNECT, i, 0);
            }
            private bool capDriverDisconnect(IntPtr lwnd)
            {
                return Cams.SendMessage(lwnd, Cams.WM_CAP_DRIVER_DISCONNECT, 0, 0);
            }
            private bool capPreview(IntPtr lwnd, bool f)
            { return Cams.SendMessage(lwnd, Cams.WM_CAP_SET_PREVIEW, f, 0); }
     
            private bool capPreviewRate(IntPtr lwnd, short wMS)
            {
                return Cams.SendMessage(lwnd, Cams.WM_CAP_SET_PREVIEWRATE, wMS, 0);
            }
     
            private bool capSetCallbackOnFrame(IntPtr lwnd, Cams.FrameEventHandler lpProc)
            {
                return Cams.SendMessage(lwnd, Cams.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);
            }
     
          
     
            public void StartCam()
            {
                byte[] lpszName = new byte[100];
                byte[] lpszVer = new byte[100];
     
                Cams.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);
                this.lwndC = Cams.capCreateCaptureWindowA(lpszName, Cams.WS_VISIBLE + Cams.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);
     

                if (this.capDriverConnect(this.lwndC, 0))//就是這裡往設備發信號無反應

                {
                    //其他操作
                }
            }

     

            public void CloseCams()
            {
                this.capDriverDisconnect(this.lwndC);
            }
        }

    有否大大能幫忙分析下,第一次用c#操作硬件類,搜索關鍵字:c# 攝像頭編程可以獲得完整的例子


    • 已移動 Bill ChungMVP, Moderator 2012年5月3日 上午 04:01 C#問題 (從:Visual Studio一般討論區(General))
    2012年5月3日 上午 03:23

解答

  • 請確認有成功取得handle:

                this.lwndC = Cams.capCreateCaptureWindowA(lpszName, Cams.WS_VISIBLE + Cams.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);
                if (this.lwndc.ToInt32() == 0) throw new Exception("Can't get camera handle!");

                if (this.capDriverConnect(this.lwndC, 0))//就是這裡往設備發信號無反應

                {
                    //其他操作
                }


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度



    2012年5月3日 下午 03:40

所有回覆

  • 沒有看到程式有呼叫StartCam方法?
    2012年5月3日 上午 05:37
  • 你用那個Cam本身的軟件,看看有沒有安裝好或那個Cam是否沒壞

    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年5月3日 上午 07:00
  • 調用沒貼,因為不算關鍵,隨便一個按鍵一個panel,

                    panel.Size = new Size(330, 400);
                    cam = new CamsController(panel.Handle, panel.Width, panel.Height);
                    cam.StartCam();


    2012年5月3日 上午 07:30
  • 試過,沒問題的,攝像頭可以用

    2012年5月3日 上午 07:31
  • 請仔細看一下這個範例  .

    http://www.dreamincode.net/forums/topic/34906-saving-an-avi-file-with-avicap32dll/

    你 就那麼確定 你 的 攝像頭 就是 第一個裝置嗎?  


    2012年5月3日 上午 11:15
  • 請確認有成功取得handle:

                this.lwndC = Cams.capCreateCaptureWindowA(lpszName, Cams.WS_VISIBLE + Cams.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);
                if (this.lwndc.ToInt32() == 0) throw new Exception("Can't get camera handle!");

                if (this.capDriverConnect(this.lwndC, 0))//就是這裡往設備發信號無反應

                {
                    //其他操作
                }


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度



    2012年5月3日 下午 03:40
  • 多謝你的回答,handle已經成功獲取

    2012年5月4日 上午 02:01
  • 很多,高興你解決了

    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年5月4日 上午 02:04
  • 不幸的是,還沒有解決,筆記本的攝像頭無論怎樣都是不能控制

    2012年5月29日 上午 06:59