C # Попытка использовать WM_CAP_SET_SEQUENCE_SETUP, чтобы позволить мне контролировать приложение во время захвата видео - PullRequest
1 голос
/ 29 января 2010

В данный момент я создаю приложение для захвата видео с веб-камеры и одновременно нажимаю различные кнопки, которые пишут в текстовый файл, чтобы делать заметки на видео. Теперь у меня все получилось, кроме того, что WM_CAP_SEQUENCE по умолчанию захватывает контроль над приложением ... так что никаких нажатий кнопок. Мне нужно передать структуру параметров захвата, чтобы сказать, что нажатие разрешено, и для bool yField установлено значение true. Вот где у меня есть небольшая проблема, я не привык к структурам, а также не совсем понимаю, как использовать WM_CAP_SET_SEQUENCE_SETUP, размещу соответствующий код ниже, и, надеюсь, кто-то сможет предложить мне некоторые идеи или указатели?

[System.Runtime.InteropServices.DllImport("user32", EntryPoint = "SendMessageA", SetLastError = true)]
    public static extern int SendMessage2(IntPtr webcam1, int Msg, IntPtr wParam, ref CAPTUREPARMS lParam);


CAPTUREPARMS CaptureParams = new CAPTUREPARMS();
        CaptureParams.fYield = 1;
        CaptureParams.fAbortLeftMouse = 0;
        CaptureParams.fAbortRightMouse = 0;
        CaptureParams.dwRequestMicroSecPerFrame = 66667;
        CaptureParams.fMakeUserHitOKToCapture = 0;
        CaptureParams.wPercentDropForError = 10;
        CaptureParams.wChunkGranularity = 0;
        CaptureParams.dwIndexSize = 0;
        CaptureParams.wNumVideoRequested = 10;
        CaptureParams.fCaptureAudio = 0;
        CaptureParams.fLimitEnabled = 0;
        CaptureParams.fMCIControl = 0;
        CaptureParams.fStepMCIDevice = 0;
        CaptureParams.dwMCIStartTime = 0;
        CaptureParams.dwMCIStopTime = 0;
        CaptureParams.fStepCaptureAt2x = 0;
        CaptureParams.wStepCaptureAverageFrames = 5;
        CaptureParams.dwAudioBufferSize = 0;


SendMessage2(webcam1, WM_CAP_SET_SEQUENCE_SETUP, new IntPtr(Marshal.SizeOf(CaptureParams)), ref CaptureParams);

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
    public struct CAPTUREPARMS
    {
        public System.UInt32 dwRequestMicroSecPerFrame;
        public System.Int32 fMakeUserHitOKToCapture;
        public System.UInt32 wPercentDropForError;
        public System.Int32 fYield;
        public System.UInt32 dwIndexSize;
        public System.UInt32 wChunkGranularity;
        public System.Int32 fCaptureAudio;
        public System.UInt32 wNumVideoRequested;
        public System.UInt32 wNumAudioRequested;
        public System.Int32 fAbortLeftMouse;
        public System.Int32 fAbortRightMouse;
        public System.Int32 fMCIControl;
        public System.Int32 fStepMCIDevice;
        public System.UInt32 dwMCIStartTime;
        public System.UInt32 dwMCIStopTime;
        public System.Int32 fStepCaptureAt2x;
        public System.UInt32 wStepCaptureAverageFrames;
        public System.UInt32 dwAudioBufferSize;



        public void SetParams(System.Int32 fYield, System.Int32 fAbortLeftMouse, System.Int32 fAbortRightMouse, System.UInt32 dwRequestMicroSecPerFrame, System.Int32 fMakeUserHitOKToCapture,
            System.UInt32 wPercentDropForError, System.UInt32 dwIndexSize, System.UInt32 wChunkGranularity, System.UInt32 wNumVideoRequested, System.Int32 fCaptureAudio, System.Int32 fMCIControl,
            System.Int32 fStepMCIDevice, System.UInt32 dwMCIStartTime, System.UInt32 dwMCIStopTime, System.Int32 fStepCaptureAt2x, System.UInt32 wStepCaptureAverageFrames, System.UInt32 dwAudioBufferSize)
        {


            this.dwRequestMicroSecPerFrame = dwRequestMicroSecPerFrame;
            this.fMakeUserHitOKToCapture = fMakeUserHitOKToCapture;
            this.fYield = fYield;
            this.wPercentDropForError = wPercentDropForError;
            this.dwIndexSize = dwIndexSize;
            this.wChunkGranularity = wChunkGranularity;
            this.wNumVideoRequested = wNumVideoRequested;
            this.fCaptureAudio = fCaptureAudio;
            this.fAbortLeftMouse = fAbortLeftMouse;
            this.fAbortRightMouse = fAbortRightMouse;
            this.fMCIControl = fMCIControl;
            this.fStepMCIDevice = fStepMCIDevice;
            this.dwMCIStartTime = dwMCIStartTime;
            this.dwMCIStopTime = dwMCIStopTime;
            this.fStepCaptureAt2x = fStepCaptureAt2x;
            this.wStepCaptureAverageFrames = wStepCaptureAverageFrames;
            this.dwAudioBufferSize = dwAudioBufferSize;

1 Ответ

0 голосов
/ 29 января 2010

wParam должен равняться размеру структуры, а wParam предшествует lParam, поэтому вы должны назвать его так:

SendMessage2(webcam1, WM_CAP_SET_SEQUENCE_SETUP, new IntPtr(Marshal.SizeOf(typeof(CAPTUREPARMS))), ref CaptureParams);

И подпись метода должна выглядеть так:

[System.Runtime.InteropServices.DllImport("user32", EntryPoint = "SendMessageA")]
public static extern IntPtr SendMessage2(IntPtr webcam1, int Msg, IntPtr wParam, ref CAPTUREPARMS lParam);

Ваша структура также имеет неправильный макет, используйте определение CAPTUREPARMS от pinvoke.net (хотя часть Pack=1 выглядит там подозрительно, так что вы можете попробовать как с ней, так и без нее).

...