Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
1

Как изменить параметр в структуре в WinAPI?

03.08.2021, 20:20. Показов 7706. Ответов 34

Author24 — интернет-сервис помощи студентам
Использую Апи Avicap32 в Делфи. Но вот не задача там структура CaptureParms а в ней переменная Fyield, ее нужно изменить на true, а у меня не получается это сделать. Нашел в MSDN пример изменения другой переменной
C++
1
2
3
4
5
6
7
8
CAPTUREPARMS CaptureParms;
float FramesPerSec = 10.0;
 
capCaptureGetSetup(hWndC, &CaptureParms, sizeof(CAPTUREPARMS));
 
CaptureParms.dwRequestMicroSecPerFrame = (DWORD) (1.0e6 / 
    FramesPerSec);
capCaptureSetSetup(hWndC, &CaptureParms, sizeof (CAPTUREPARMS));
Но перевести в Делфи не вышло, следственно изменить FYield тоже. Вот сами сообщения и структура:
C++
1
2
3
WM_CAP_GET_SEQUENCE_SETUP 
wParam = (WPARAM) (wSize); 
lParam = (LPARAM) (LPVOID) (LPCAPTUREPARMS) (s);
C++
1
2
3
WM_CAP_SET_SEQUENCE_SETUP 
wParam = (WPARAM) (wSize); 
lParam = (LPARAM) (LPVOID) (LPCAPTUREPARMS) (psCapParms);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
typedef struct { 
    DWORD dwRequestMicroSecPerFrame; 
    BOOL  fMakeUserHitOKToCapture; 
    UINT  wPercentDropForError; 
    BOOL  fYield;                              //Вот эта нужна
    DWORD dwIndexSize; 
    UINT  wChunkGranularity; 
    BOOL  fUsingDOSMemory; 
    UINT  wNumVideoRequested; 
    BOOL  fCaptureAudio; 
    UINT  wNumAudioRequested; 
    UINT  vKeyAbort; 
    BOOL  fAbortLeftMouse; 
    BOOL  fAbortRightMouse; 
    BOOL  fLimitEnabled; 
    UINT  wTimeLimit; 
    BOOL  fMCIControl; 
    BOOL  fStepMCIDevice; 
    DWORD dwMCIStartTime; 
    DWORD dwMCIStopTime; 
    BOOL  fStepCaptureAt2x; 
    UINT  wStepCaptureAverageFrames; 
    DWORD dwAudioBufferSize; 
    BOOL  fDisableWriteCache; 
    UINT  AVStreamMaster; 
} CAPTUREPARMS;
Как изменить параметр?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2021, 20:20
Ответы с готовыми решениями:

Как изменить все элементы в структуре одним действием
Есть к примеру такая структура: Structure IntData Public ID1 As Integer ...

Как изменить параметр в скрипте?
Здравствуйте товарищи! Помогите пожалуйста решить проблему. Есть некая функция js которая добавляет...

Как изменить параметр процедуры?
Вот такая примерно программа и процедура в ней Program test(input,output); procedure...

Как изменить параметр в программе
У меня есть программа на C# (Не моя, но доступ к исходному коду есть) и я пишу как бэ плагин к этой...

34
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,425
04.08.2021, 01:35 2
Что значит "не вышло"? Как может не выйти написать:
Delphi
1
CaptureParms.fYield := True;
?

Показывайте свой код.
0
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
04.08.2021, 20:14  [ТС] 3
Вот константы сообщений:
Delphi
1
2
3
4
5
6
7
8
9
const
   WM_CAP_START                  = WM_USER;
   WM_CAP_SEQUENCE               = WM_CAP_START + 62;
   WM_CAP_DRIVER_CONNECT         = WM_CAP_START + 10;
   WM_CAP_SEQUENCE_NOFILE        = WM_CAP_START + 63;
   WM_CAP_FILE_SAVEAS            = WM_CAP_START + 23;
   WM_CAP_SET_SEQUENCE_SETUP     = WM_CAP_START + 64;
   WM_CAP_GET_SEQUENCE_SETUP     = WM_CAP_START + 65;
   WM_CAP_DRIVER_GET_CAPS        = WM_CAP_START + 14;
Так же описана структура
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type CAPTUREPARMS                   = ^TCAPTUREPARMS;
    TCAPTUREPARMS                   = record
        dwRequestMicroSecPerFrame   : DWORD ;   // Requested capture rate
        fMakeUserHitOKToCapture     : BOOL  ;   // Show "Hit OK to cap" dlg?
        wPercentDropForError        : UINT  ;   // Give error msg if > (10%)
        fYield                      : BOOL  ;   // Capture via background task?
        dwIndexSize                 : DWORD ;   // Max index size in frames (32K)
        wChunkGranularity           : UINT  ;   // Junk chunk granularity (2K)
        fUsingDOSMemory             : BOOL  ;   // Use DOS buffers?
        wNumVideoRequested          : UINT  ;   // # video buffers, If 0, autocalc
        fCaptureAudio               : BOOL  ;   // Capture audio?
        wNumAudioRequested          : UINT  ;   // # audio buffers, If 0, autocalc
        vKeyAbort                   : UINT  ;   // Virtual key causing abort
        fAbortLeftMouse             : BOOL  ;   // Abort on left mouse?
        fAbortRightMouse            : BOOL  ;   // Abort on right mouse?
        fLimitEnabled               : BOOL  ;   // Use wTimeLimit?
        wTimeLimit                  : UINT  ;   // Seconds to capture
        fMCIControl                 : BOOL  ;   // Use MCI video source?
        fStepMCIDevice              : BOOL  ;   // Step MCI device?
        dwMCIStartTime              : DWORD ;   // Time to start in MS
        dwMCIStopTime               : DWORD ;   // Time to stop in MS
        fStepCaptureAt2x            : BOOL  ;   // Perform spatial averaging 2x
        wStepCaptureAverageFrames   : UINT  ;   // Temporal average n Frames
        dwAudioBufferSize           : DWORD ;   // Size of audio bufs (0 = default)
        fDisableWriteCache          : BOOL  ;   // Attempt to disable write cache
        AVStreamMaster              : UINT  ;   // Which stream controls length?
    end;
Структуру и сообщения брал из библиотеки VFW.
Функция создания окна:
Delphi
1
2
3
4
5
6
7
8
9
function capCreateCaptureWindowA(lpszWindowName : PCHAR;
                                 dwStyle : longint;
                                 x : integer;
                                 y : integer;
                                 nWidth : integer;
                                 nHeight : integer;
                                 ParentWin  : HWND;
                                 nId : integer): HWND;
                                 STDCALL; EXTERNAL 'AVICAP32.DLL';
По нажатию кнопки срабатывает создание окна и подключение драйвера, тут все работает:
Delphi
1
2
3
4
5
6
7
8
9
10
hWndC := capCreateCaptureWindowA('My Own Capture Window',
                                   WS_CHILD or WS_VISIBLE ,
                                   Panel1.Left,
                                   Panel1.Top,
                                   Panel1.Width,
                                   Panel1.Height,
                                   Form1.Handle,
                                   0);
 
      SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
По нажатию второй кнопки срабатывает проблемный код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var
   szName: PAnsiChar;
   CaptureParms1: CAPTUREPARMS;
   Frame: LongBool;
  
begin
   szName:='New.avi'; //Место сохранения
 
    SendMessage (hWndC, WM_CAP_GET_SEQUENCE_SETUP, SizeOf(CAPTUREPARMS), Lparam ( CaptureParms1));//Считываем настройки
 
 
 CAPTUREPARMS1.fYield:= true;     //Изменяем настройку
 
 
 SendMessage (hWndC, WM_CAP_SET_SEQUENCE_SETUP, SizeOf(CaptureParms), Lparam (CaptureParms1)); //Отправляем
 
 
 
 
      SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
 
    SendMessage(hWndC,WM_CAP_FILE_SAVEAS, 0, Lparam(szName));
 
end;
Как то так.
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,425
05.08.2021, 00:59 4
Вы пытаетесь привести здоровенную структуру CAPTUREPARMS к 32/64-битному LPARAM. Естественно так ничего не будет работать.

В примере из MSDN к LPARAM приводится не CAPTUREPARMS, а LPCAPTUREPARMS, т.е. указатель на CAPTUREPARMS. Вот и вы пишите:
Delphi
1
2
3
SendMessage(hWndC, WM_CAP_GET_SEQUENCE_SETUP, SizeOf(CaptureParms1), LParam(@CaptureParms1));
CaptureParms1.fYield := True;
SendMessage(hWndC, WM_CAP_SET_SEQUENCE_SETUP, SizeOf(CaptureParms1), LParam(@CaptureParms1));
1
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
09.08.2021, 12:39  [ТС] 5
Получилось, эти 3 строчки работают без ошибок, но вот не задача, они не реализуются(как будто их не было). Проверял, при выполнении программы возвращают истину. И для каждого параметра нужно отправлять сообщение? Или можно написать несколько присвоений параметров и отправить 1 сообщение?
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
09.08.2021, 16:07 6
Цитата Сообщение от legat Посмотреть сообщение
Или можно написать несколько присвоений параметров и отправить 1 сообщение?
Да.
1
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
10.08.2021, 20:25  [ТС] 7
Реализовал эти три строчки как вы мне показали, но толку от них нет, думал сам додумаю как это решить но нет. В MSDN сказано, что изменив этот параметр FYield Авицап сам создаст отдельный поток и программа не зависнет, но этого не происходит. Я пробовал вписать другие параметры (fMakeUserHitOKToCapture) но так же реакции ни какой.

В чем может быть причина?
0
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
11.08.2021, 14:14  [ТС] 8
Пожалуйста подскажите, что с этим делать?
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
11.08.2021, 14:48 9
Два вопроса:

1. Если не трогать fYield, работает?
2. Если выводить не в файл, а в окошко, работает?
1
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
11.08.2021, 16:48  [ТС] 10
Работает, если я не использую сообщение изменения параметра и если использую как это описал quwy, оно запускается и работает абсолютно одинаково для обоих случаев. Пробовал убирать сообщение записи в файл, оставив только сообщение инициации захвата(зачем не знаю, с ним тоже работает). Дело в том что нет реакции приложения на измененный параметр(даже нескольких), оно работает так как будто нет этих строчек на изменение параметра.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
11.08.2021, 17:07 11
Так, есть 4 возможных варианта:
1. Вывод в окошко при fYield = false.
2. Вывод в окошко при fYield = true.
3. Вывод в файл при fYield = false.
4. Вывод в файл при fYield = true.

У Вас при запуске программы после любых манипуляций с полями CaptureParms1 работает всегда вариант 1?
0
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
11.08.2021, 18:05  [ТС] 12
Вот такой код, ну и частично из предыдущих ответов
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.Button1Click(Sender: TObject);
  var
   szName: PAnsiChar;
   CaptureParms1: CAPTUREPARMS;
   Frame: LongBool;
begin
Hwndc := capCreateCaptureWindowA('My Own Capture Window',
                                   WS_CHILD or WS_VISIBLE ,
                                   Panel1.Left,
                                   Panel1.Top,
                                   Panel1.Width,
                                   Panel1.Height,
                                   Form1.Handle,
                                   0);
 
  SendMessage(Hwndc,WM_CAP_DRIVER_CONNECT,0,0);
 
  szName:= 'New.avi';
 
  SendMessage(Hwndc,WM_CAP_GET_SEQUENCE_SETUP, SizeOf(captureparms1), Lparam(@captureParms1));
  CaptureParms1.fYield:= True;
  SendMessage(Hwndc, WM_CAP_SET_SEQUENCE_SETUP, SizeOf(CaptureParms1), Lparam(@captureParms1));
 
  SendMessage(Hwndc, WM_CAP_SEQUENCE,0,0);
  SendMessage(Hwndc,WM_CAP_FILE_SAVEAS,0,Lparam(szName));
 
end;
Между 20 и 22 строчкой добавлял другие параметры (пример: вывод диалогового окна перед началом записи), убирал вообще строчки 20-22. При всех этих манипуляциях работа приложения не изменяется

Да, работает только первый вариант.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
11.08.2021, 18:46 13
А не пробовали сообщение WM_CAP_FILE_SAVEAS отправлять ДО WM_CAP_SEQUENCE?

Добавлено через 8 минут
И точно ли, что надо использовать WM_CAP_FILE_SAVEAS, а не WM_CAP_FILE_SET_CAPTURE_FILE?

Добавлено через 13 минут
Вот код на C, автор которого клянётся, что у него всё работает:
C++
1
2
3
4
5
p = SendMessage(hMyWindow, WM_CAP_FILE_SET_CAPTURE_FILE , 0,(LPARAM) (LPVOID) cname1);
p = SendMessage(hMyWindow, WM_CAP_GET_SEQUENCE_SETUP, sizeof(CaptureParams),(LPARAM) (LPVOID) LPCAPTUREPARMS) &CaptureParams);
CaptureParams.fYield = 1;
p = SendMessage(hMyWindow, WM_CAP_SET_SEQUENCE_SETUP, sizeof(CaptureParams),(LPARAM) (LPVOID)(LPCAPTUREPARMS) &CaptureParams);
p = SendMessage(hMyWindow, WM_CAP_SEQUENCE, 0, 0);
0
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
11.08.2021, 20:30  [ТС] 14
Не поверите не работает, я сделал по всем вашим рекомендациям, но нет. Как и было запускается, снимает, записывает, но пока это происходит зависает.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
11.08.2021, 20:40 15
Цитата Сообщение от legat Посмотреть сообщение
Как и было запускается, снимает, записывает
Стоп-стоп. В прошлый же раз Вы сказали, что работает исключительно вывод в окошко...

Попробуйте сделать тестовую программу вообще без кнопки. Пусть захват начинается просто по факту запуска программы.

И ещё. Посмотрите отладчиком запись CaptureParms1, которую возвращает WM_CAP_GET_SEQUENCE_SETUP, - там осмысленные значения у полей?
0
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
12.08.2021, 18:50  [ТС] 16
Прошу прощения, я забыл указать третий вариант. В случае если код начинает выполнятся при создании формы(onCreate) окно приложения не появляется до щелчка мыши (это одна из настроек в CAPTUREPARMS, останавливает запись при нажатии на клавишу мыши). Я сделал из этого вывод, что оно по прежнему зависает во время записи. Еще пробовал запустить в новом эмбаркадеро делфи 10, но там тоже не работает.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
12.08.2021, 19:00 17
Цитата Сообщение от legat Посмотреть сообщение
В случае если код начинает выполнятся при создании формы(onCreate) окно приложения не появляется до щелчка мыши
До щелчка мыши по чему? Окна приложения же ещё на экране нет.

Я бы предложил в тестовую программу после строки с WM_CAP_SET_SEQUENCE_SETUP добавить ещё одну строку с WM_CAP_GET_SEQUENCE_SETUP и посмотреть отладчиком, правдоподобны ли значения, возвращаемые первым вызовом WM_CAP_GET_SEQUENCE_SETUP, и будет ли fYield = true в том, что вернёт второй вызов. Если будет, то попробовать для WM_CAP_SEQUENCE использовать не SEND, а POST.
0
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
13.08.2021, 14:24  [ТС] 18
Добавил вот такой блок для проверки состояний параметров до и после WM_CAP_SET_SEQUENCE_SETUP
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
if  CaptureParms1.fYield= True then
  begin
    Memo1.Lines.Add('1');
  end else
  begin
   Memo1.Lines.Add('0');
  end;
 
  if  CaptureParms1.fAbortLeftMouse= True then
  begin
    Memo1.Lines.Add('Mouse 1');
  end else
  begin
   Memo1.Lines.Add('Mouse 0');
  end;
До выполнения приходят:
1
Mouse 0
Это очень странно, ведь в документации MSDN четко написано, что второй параметр по умолчанию True.
После выполнения:
0
Mouse 0
(все таки я его переключал fAbortLeftMouse в False, что бы его отключить и запись не прекращалась по нажатию кнопки мыши(Кстати по этой причине в прошлый раз приложение появлялось по нажатию кнопки, запись прекращалась и omCreate выполнялось)).

Я решил наоборот переключить fAbortLeftMouse в True, может тогда будет работать, но нет как было так и осталось.

Попробовал использовать Post вместо Send, (так как второй обработчик я приписал после
Delphi
1
PostMessage(Hwndc, WM_CAP_SEQUENCE,0,0);
он выполнялся сразу, а не как с Send после нажатия кнопки мыши) диск (ну или кружочек курсора) загрузки как крутился так и крутится. И я решил добавить fAbortLeftMouse посмотреть может он заработает, но он не заработал, что видно из выше сказанного. Я так понял ошибка наверно в описанной CAPTUREPARMS?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type CAPTUREPARMS                   = ^TCAPTUREPARMS;
    TCAPTUREPARMS                   = record
        dwRequestMicroSecPerFrame   : DWORD ;   // Requested capture rate
        fMakeUserHitOKToCapture     : BOOL  ;   // Show "Hit OK to cap" dlg?
        wPercentDropForError        : UINT  ;   // Give error msg if > (10%)
        fYield                      : BOOL  ;   // Capture via background task?
        dwIndexSize                 : DWORD ;   // Max index size in frames (32K)
        wChunkGranularity           : UINT  ;   // Junk chunk granularity (2K)
        fUsingDOSMemory             : BOOL  ;   // Use DOS buffers?
        wNumVideoRequested          : UINT  ;   // # video buffers, If 0, autocalc
        fCaptureAudio               : BOOL  ;   // Capture audio?
        wNumAudioRequested          : UINT  ;   // # audio buffers, If 0, autocalc
        vKeyAbort                   : UINT  ;   // Virtual key causing abort
        fAbortLeftMouse             : BOOL  ;   // Abort on left mouse?
        fAbortRightMouse            : BOOL  ;   // Abort on right mouse?
        fLimitEnabled               : BOOL  ;   // Use wTimeLimit?
        wTimeLimit                  : UINT  ;   // Seconds to capture
        fMCIControl                 : BOOL  ;   // Use MCI video source?
        fStepMCIDevice              : BOOL  ;   // Step MCI device?
        dwMCIStartTime              : DWORD ;   // Time to start in MS
        dwMCIStopTime               : DWORD ;   // Time to stop in MS
        fStepCaptureAt2x            : BOOL  ;   // Perform spatial averaging 2x
        wStepCaptureAverageFrames   : UINT  ;   // Temporal average n Frames
        dwAudioBufferSize           : DWORD ;   // Size of audio bufs (0 = default)
        fDisableWriteCache          : BOOL  ;   // Attempt to disable write cache
        AVStreamMaster              : UINT  ;   // Which stream controls length?
    end;
Так она описана у меня.
Да кстати, пробовал приписать Post к другим сообщениям.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 189
13.08.2021, 14:45 19
Лучший ответ Сообщение было отмечено legat как решение

Решение

Цитата Сообщение от legat Посмотреть сообщение
До выполнения приходят:
1
Mouse 0
Не удивляет(настораживает), что в первой строке 1, когда согласно документации положено быть нулю?

А теперь подумайте, как согласуются обращения вида:
Pascal
1
2
CaptureParms1.fYield
CaptureParms1.fAbortLeftMouse
с определением:
Pascal
1
2
3
type CAPTUREPARMS = ^TCAPTUREPARMS;
 
var CaptureParms1: CAPTUREPARMS;
(Как компилятор вообще это пропускает???)
1
2 / 2 / 0
Регистрация: 02.08.2021
Сообщений: 51
13.08.2021, 17:50  [ТС] 20
Ох, блин, я их перепутал. До выполнения ноль после 1. Вот весь код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    Hwndc : THandle;
    { Public declarations }
  end;
 
type CAPTUREPARMS                   = ^TCAPTUREPARMS;
    TCAPTUREPARMS                   = record
        dwRequestMicroSecPerFrame   : DWORD ;   // Requested capture rate
        fMakeUserHitOKToCapture     : BOOL  ;   // Show "Hit OK to cap" dlg?
        wPercentDropForError        : UINT  ;   // Give error msg if > (10%)
        fYield                      : BOOL  ;   // Capture via background task?
        dwIndexSize                 : DWORD ;   // Max index size in frames (32K)
        wChunkGranularity           : UINT  ;   // Junk chunk granularity (2K)
        fUsingDOSMemory             : BOOL  ;   // Use DOS buffers?
        wNumVideoRequested          : UINT  ;   // # video buffers, If 0, autocalc
        fCaptureAudio               : BOOL  ;   // Capture audio?
        wNumAudioRequested          : UINT  ;   // # audio buffers, If 0, autocalc
        vKeyAbort                   : UINT  ;   // Virtual key causing abort
        fAbortLeftMouse             : BOOL  ;   // Abort on left mouse?
        fAbortRightMouse            : BOOL  ;   // Abort on right mouse?
        fLimitEnabled               : BOOL  ;   // Use wTimeLimit?
        wTimeLimit                  : UINT  ;   // Seconds to capture
        fMCIControl                 : BOOL  ;   // Use MCI video source?
        fStepMCIDevice              : BOOL  ;   // Step MCI device?
        dwMCIStartTime              : DWORD ;   // Time to start in MS
        dwMCIStopTime               : DWORD ;   // Time to stop in MS
        fStepCaptureAt2x            : BOOL  ;   // Perform spatial averaging 2x
        wStepCaptureAverageFrames   : UINT  ;   // Temporal average n Frames
        dwAudioBufferSize           : DWORD ;   // Size of audio bufs (0 = default)
        fDisableWriteCache          : BOOL  ;   // Attempt to disable write cache
        AVStreamMaster              : UINT  ;   // Which stream controls length?
 
 
    end;
 
 
 
 
var
  Form1: TForm1;
 
 
 
  const
   WM_CAP_START                  = WM_USER;
   WM_CAP_SEQUENCE               = WM_CAP_START + 62;
   WM_CAP_DRIVER_CONNECT         = WM_CAP_START + 10;
   WM_CAP_SEQUENCE_NOFILE        = WM_CAP_START + 63;
   WM_CAP_FILE_SAVEAS            = WM_CAP_START + 23;
   WM_CAP_SET_SEQUENCE_SETUP     = WM_CAP_START + 64;
   WM_CAP_GET_SEQUENCE_SETUP     = WM_CAP_START + 65;
   WM_CAP_DRIVER_GET_CAPS        = WM_CAP_START + 14;
   WM_CAP_SET_CALLBACK_YIELD     = WM_CAP_START + 4;
   WM_CAP_FILE_SET_CAPTURE_FILE  = WM_CAP_START + 20;
implementation
 
{$R *.dfm}
{******************************************************************************}
//Библиотека
 function capCreateCaptureWindowA(lpszWindowName : PCHAR;
                                 dwStyle : longint;
                                 x : integer;
                                 y : integer;
                                 nWidth : integer;
                                 nHeight : integer;
                                 ParentWin  : HWND;
                                 nId : integer): HWND;
                                 STDCALL; EXTERNAL 'AVICAP32.DLL';
 
 
 
 
{******************************************************************************}
 
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
  var
   szName: PAnsiChar;
   CaptureParms1: CAPTUREPARMS;
 
begin
Hwndc := capCreateCaptureWindowA('My Own Capture Window',
                                   WS_CHILD or WS_VISIBLE ,
                                   Panel1.Left,
                                   Panel1.Top,
                                   Panel1.Width,
                                   Panel1.Height,
                                   Form1.Handle,
                                   0);
 
  SendMessage(Hwndc,WM_CAP_DRIVER_CONNECT,0,0);
 
  szName:= 'New.avi';
 
  SendMessage(Hwndc, WM_CAP_GET_SEQUENCE_SETUP, SizeOf(captureparms1), Lparam(@captureParms1));
   if  CaptureParms1.fYield= True then
  begin
    Memo1.Lines.Add('1');
  end else
  begin
   Memo1.Lines.Add('0');
  end;
 
  if  CaptureParms1.fAbortLeftMouse= True then
  begin
    Memo1.Lines.Add('Mouse 1');
  end else
  begin
   Memo1.Lines.Add('Mouse 0');
  end;
  CaptureParms1.fYield:= True;
  CaptureParms1.fAbortLeftMouse:= False;
  SendMessage(Hwndc, WM_CAP_SET_SEQUENCE_SETUP, SizeOf(CaptureParms1), Lparam(@captureParms1));
 
  SendMessage(Hwndc,WM_CAP_FILE_SET_CAPTURE_FILE,0,Lparam(szName));
  PostMessage(Hwndc, WM_CAP_SEQUENCE,0,0);
  //SendMessage(Hwndc,WM_CAP_FILE_SAVEAS,0,Lparam(szName));
 
  SendMessage(Hwndc, WM_CAP_GET_SEQUENCE_SETUP, SizeOf(captureparms1), Lparam(@captureParms1));
  if  CaptureParms1.fYield= True then
  begin
    Memo1.Lines.Add('1');
  end else
  begin
   Memo1.Lines.Add('0');
  end;
 
  if  CaptureParms1.fAbortLeftMouse= True then
  begin
    Memo1.Lines.Add('Mouse 1');
  end else
  begin
   Memo1.Lines.Add('Mouse 0');
  end;
end;
 
end.
На форме кнопка мемо и панель.

Добавлено через 11 минут
Хехе я наверно две недели парился над этой настройкой параметров, а окозалось все просто(я конечно так и думал но не знал как). Все го то нужно было поставить собачку в LPARAM и указвать не CAPTUREPARMS а TCAPTUREPARMS.
Delphi
1
SendMessage(Hwndc, WM_CAP_GET_SEQUENCE_SETUP, SizeOf(captureparms1), Lparam(@captureParms1));
Delphi
1
2
type CAPTUREPARMS                   = ^TCAPTUREPARMS;
    TCAPTUREPARMS                   = record
Заработало, спасибо большое за помощь.
0
13.08.2021, 17:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2021, 17:50
Помогаю со студенческими работами здесь

Как изменить не отображаемый параметр?
Всем снова привет. Помогите пожалуйста, объясните пожалуйста как мне у объекта (Rectangle) изменить...

Как изменить параметр Background в Grid?
подскажите как изменить цвет(Background) в grid

Как изменить шаблоне параметр в WordPress?
Здравствуйте. Решил попробовать освоить WordPress. Из-за нехватки знаний могу не грамотно объяснить...

Как изменить параметр дочернего обьекта?
Вот у меня есть префаб, который я Instantiate. Мне нужно обратится к вложеному в елементу...

Пожалуйста подскажите как изменить параметр
Пожалуйста подскажите как изменить параметр нейм чар(20) на неймчар(15) при помощи апдейт CREATE...

Параметр navigator.appName как изменить
Всем привет! Есть один сайт, который пускает только через internet explorer не давно я узнал,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru