Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 22.05.18 10:24 
Hallo Forum

Problemstellung:
Der Artikel Video Capture beinhaltet (C und C++) Makros, die ich nach Delphi übersetzen möchte.
An einigen Stellen weiss ich garnicht, welchen Typ ich den Variablen zuweisen soll. Ich nehme jetzt einfach mal ein Beispiel heraus, welches oft vorkommt:

ausblenden Vfw.h
1:
#define capGetStatus(hwnd, s, wSize)               ((BOOL)AVICapSM(hwnd, WM_CAP_GET_STATUS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPSTATUS)(s)))					

capGetStatus (macro) hat folgendes geschrieben:
hwnd
Handle to a capture window.
s
Pointer to a CAPSTATUS structure.
wSize
Size, in bytes, of the structure referenced by s.

Welchen Typ sollte man dem Parameter wSize zuweisen?

Das "w"-Präfix deutet eher zum "Word". Schaut man sich die dazugehörige "CAPSTATUS"-Struktur an:

ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
typedef struct {
  // ...
  DWORD    dwReturn;
  UINT     wNumVideoAllocated;
  UINT     wNumAudioAllocated;
} CAPSTATUS;

so läuft es hier zumindest auf UINT bzw. DWORD hinaus, also einen vorzeichenlosen Int32.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mi 23.05.18 11:38 
Ja, soweit ich weiß ist wsize ein Makro für uint32_t bzw unsigned int

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 23.05.18 13:03 
Mag sein, nur ist das hier eine Variable, die rein zufällig genau so heisst. Es besteht kein Zusammenhang zu dem von dir genannten Makro.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1137
Erhaltene Danke: 75

Win7
DXE2 Prof, Lazarus
BeitragVerfasst: Mi 23.05.18 13:21 
Das sieht aus als wenn die gleichen Parameter Typen verwendet werden wie bei Windows Messages. Also WPARAM und LPARAM. Damit wäre klar um was es sich handelt.
Allerdings wird LPARAM scheinbar als Definition für die Größe eines Zeigers verwendet.

Wenn ich das richtig verstehe dann ist der für Dich interessante Teil eh:
ausblenden C++-Quelltext
1:
... ((BOOL)AVICapSM(hwnd, WM_CAP_GET_STATUS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPSTATUS)(s)))					

Vorne ist ja nur die Verschönerung die Du in C/C++ verwenden kannst als Ersatz für den cryptischen Aufruf.

_________________
Solange keine Zeile Code geschrieben ist, läuft ein Programm immer fehlerfrei.
Ich teste nicht, weil ich Angst habe Fehler zu finden.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 23.05.18 13:44 
Du hast recht. Die Variable wSize wird mit WPARAM gecastet, also sollte es auch bei mir ein WPARAM oder ein Alias zu WPARAM sein.

Zu guter Letzt: Welchen Typ nimmt WPARAM unter Delphi in einer Win64 Anwendung an?

Nachtrag

Unter Lazarus getestet, ergibt ein WPARAM in einer Win32 Anwendung, Integer, und in einer Win64 Anwendung, Int64. WPARAM wäre somit auch ein NativeInt.
Aus der Sicht von C++, wäre WPARAM ein NativeUInt:

ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
typedef UINT_PTR WPARAM;

#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif

siehe: Windows Data Types

Die Variable wSize ist somit weder Word noch DWORD, sondern NativeInt!


Das Thema hat sich erledigt !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 24.05.18 12:58 
Meine Übersetzung zu Video Capture:

ausblenden volle Höhe Delphi-Quelltext
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:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850:
851:
852:
853:
854:
855:
856:
857:
858:
859:
860:
861:
862:
863:
864:
865:
866:
867:
868:
869:
870:
871:
872:
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913:
914:
915:
916:
917:
918:
919:
920:
921:
922:
923:
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
938:
939:
940:
941:
942:
943:
944:
945:
946:
947:
948:
949:
950:
951:
952:
953:
954:
955:
956:
957:
958:
959:
960:
961:
962:
963:
964:
965:
966:
967:
968:
969:
970:
971:
972:
973:
974:
975:
976:
977:
978:
979:
980:
981:
982:
983:
984:
985:
986:
987:
988:
989:
990:
991:
992:
993:
994:
995:
996:
997:
998:
999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
1020:
1021:
1022:
1023:
1024:
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104:
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178:
1179:
1180:
1181:
1182:
1183:
1184:
1185:
1186:
1187:
1188:
1189:
1190:
1191:
1192:
1193:
1194:
1195:
1196:
1197:
1198:
1199:
1200:
1201:
1202:
1203:
1204:
1205:
1206:
1207:
1208:
1209:
1210:
1211:
1212:
1213:
1214:
1215:
1216:
1217:
1218:
1219:
1220:
1221:
1222:
1223:
1224:
1225:
1226:
1227:
1228:
1229:
1230:
1231:
1232:
1233:
1234:
1235:
1236:
1237:
1238:
1239:
1240:
1241:
1242:
1243:
1244:
1245:
1246:
1247:
1248:
1249:
1250:
1251:
1252:
1253:
1254:
1255:
1256:
1257:
1258:
1259:
1260:
1261:
1262:
1263:
1264:
1265:
1266:
1267:
1268:
1269:
1270:
1271:
1272:
1273:
1274:
1275:
1276:
1277:
1278:
1279:
1280:
1281:
1282:
1283:
1284:
1285:
1286:
1287:
1288:
1289:
1290:
1291:
1292:
1293:
1294:
1295:
1296:
1297:
1298:
1299:
1300:
unit uVideoCapture;

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

interface

type
{ Additional Type Definitions }

  DWORD = LongWord;
  HPALETTE = type LongWord;
  HWND = type LongWord;
  {$IFDEF WIN64}
  DWORD_PTR = UInt64;
  LRESULT = Int64;
  NativeInt = Int64;
  {$ELSE}
  DWORD_PTR = Cardinal;
  LRESULT = Integer;
  NativeInt = Integer;
  {$ENDIF}

const
{ Additional Messages }

  WM_USER                         = $400;

{ Video Capture Messages }

  WM_CAP_START                    = WM_USER;
  WM_CAP_UNICODE_START            = WM_USER + 100;

  WM_CAP_GET_CAP_STREAMPTR        = WM_CAP_START + 1;

  WM_CAP_SET_CALLBACK_ERRORW      = WM_CAP_UNICODE_START + 2;
  WM_CAP_SET_CALLBACK_STATUSW     = WM_CAP_UNICODE_START + 3;
  WM_CAP_SET_CALLBACK_ERRORA      = WM_CAP_START + 2;
  WM_CAP_SET_CALLBACK_STATUSA     = WM_CAP_START + 3;
  {$IFDEF UNICODE}
  WM_CAP_SET_CALLBACK_ERROR       = WM_CAP_SET_CALLBACK_ERRORW;
  WM_CAP_SET_CALLBACK_STATUS      = WM_CAP_SET_CALLBACK_STATUSW;
  {$ELSE}
  WM_CAP_SET_CALLBACK_ERROR       = WM_CAP_SET_CALLBACK_ERRORA;
  WM_CAP_SET_CALLBACK_STATUS      = WM_CAP_SET_CALLBACK_STATUSA;
  {$ENDIF}

  WM_CAP_SET_CALLBACK_YIELD       = WM_CAP_START + 4;
  WM_CAP_SET_CALLBACK_FRAME       = WM_CAP_START + 5;
  WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
  WM_CAP_SET_CALLBACK_WAVESTREAM  = WM_CAP_START + 7;
  WM_CAP_GET_USER_DATA            = WM_CAP_START + 8;
  WM_CAP_SET_USER_DATA            = WM_CAP_START + 9;

  WM_CAP_DRIVER_CONNECT           = WM_CAP_START + 10;
  WM_CAP_DRIVER_DISCONNECT        = WM_CAP_START + 11;

  WM_CAP_DRIVER_GET_NAMEA         = WM_CAP_START + 12;
  WM_CAP_DRIVER_GET_VERSIONA      = WM_CAP_START + 13;
  WM_CAP_DRIVER_GET_NAMEW         = WM_CAP_UNICODE_START + 12;
  WM_CAP_DRIVER_GET_VERSIONW      = WM_CAP_UNICODE_START + 13;
  {$IFDEF UNICODE}
  WM_CAP_DRIVER_GET_NAME          = WM_CAP_DRIVER_GET_NAMEW;
  WM_CAP_DRIVER_GET_VERSION       = WM_CAP_DRIVER_GET_VERSIONW;
  {$ELSE}
  WM_CAP_DRIVER_GET_NAME          = WM_CAP_DRIVER_GET_NAMEA;
  WM_CAP_DRIVER_GET_VERSION       = WM_CAP_DRIVER_GET_VERSIONA;
  {$ENDIF}

  WM_CAP_DRIVER_GET_CAPS          = WM_CAP_START + 14;

  WM_CAP_FILE_SET_CAPTURE_FILEA   = WM_CAP_START + 20;
  WM_CAP_FILE_GET_CAPTURE_FILEA   = WM_CAP_START + 21;
  WM_CAP_FILE_SAVEASA             = WM_CAP_START + 23;
  WM_CAP_FILE_SAVEDIBA            = WM_CAP_START + 25;
  WM_CAP_FILE_SET_CAPTURE_FILEW   = WM_CAP_UNICODE_START + 20;
  WM_CAP_FILE_GET_CAPTURE_FILEW   = WM_CAP_UNICODE_START + 21;
  WM_CAP_FILE_SAVEASW             = WM_CAP_UNICODE_START + 23;
  WM_CAP_FILE_SAVEDIBW            = WM_CAP_UNICODE_START + 25;
  {$IFDEF UNICODE}
  WM_CAP_FILE_SET_CAPTURE_FILE    = WM_CAP_FILE_SET_CAPTURE_FILEW;
  WM_CAP_FILE_GET_CAPTURE_FILE    = WM_CAP_FILE_GET_CAPTURE_FILEW;
  WM_CAP_FILE_SAVEAS              = WM_CAP_FILE_SAVEASW;
  WM_CAP_FILE_SAVEDIB             = WM_CAP_FILE_SAVEDIBW;
  {$ELSE}
  WM_CAP_FILE_SET_CAPTURE_FILE    = WM_CAP_FILE_SET_CAPTURE_FILEA;
  WM_CAP_FILE_GET_CAPTURE_FILE    = WM_CAP_FILE_GET_CAPTURE_FILEA;
  WM_CAP_FILE_SAVEAS              = WM_CAP_FILE_SAVEASA;
  WM_CAP_FILE_SAVEDIB             = WM_CAP_FILE_SAVEDIBA;
  {$ENDIF}
  WM_CAP_FILE_ALLOCATE            = WM_CAP_START + 22;
  WM_CAP_FILE_SET_INFOCHUNK       = WM_CAP_START + 24;

  WM_CAP_EDIT_COPY                = WM_CAP_START + 30;

  WM_CAP_SET_AUDIOFORMAT          = WM_CAP_START + 35;
  WM_CAP_GET_AUDIOFORMAT          = WM_CAP_START + 36;

  WM_CAP_DLG_VIDEOFORMAT          = WM_CAP_START + 41;
  WM_CAP_DLG_VIDEOSOURCE          = WM_CAP_START + 42;
  WM_CAP_DLG_VIDEODISPLAY         = WM_CAP_START + 43;
  WM_CAP_GET_VIDEOFORMAT          = WM_CAP_START + 44;
  WM_CAP_SET_VIDEOFORMAT          = WM_CAP_START + 45;
  WM_CAP_DLG_VIDEOCOMPRESSION     = WM_CAP_START + 46;

  WM_CAP_SET_PREVIEW              = WM_CAP_START + 50;
  WM_CAP_SET_OVERLAY              = WM_CAP_START + 51;
  WM_CAP_SET_PREVIEWRATE          = WM_CAP_START + 52;
  WM_CAP_SET_SCALE                = WM_CAP_START + 53;
  WM_CAP_GET_STATUS               = WM_CAP_START + 54;
  WM_CAP_SET_SCROLL               = WM_CAP_START + 55;

  WM_CAP_GRAB_FRAME               = WM_CAP_START + 60;
  WM_CAP_GRAB_FRAME_NOSTOP        = WM_CAP_START + 61;

  WM_CAP_SEQUENCE                 = WM_CAP_START + 62;
  WM_CAP_SEQUENCE_NOFILE          = WM_CAP_START + 63;
  WM_CAP_SET_SEQUENCE_SETUP       = WM_CAP_START + 64;
  WM_CAP_GET_SEQUENCE_SETUP       = WM_CAP_START + 65;

  WM_CAP_SET_MCI_DEVICEA          = WM_CAP_START + 66;
  WM_CAP_GET_MCI_DEVICEA          = WM_CAP_START + 67;
  WM_CAP_SET_MCI_DEVICEW          = WM_CAP_UNICODE_START + 66;
  WM_CAP_GET_MCI_DEVICEW          = WM_CAP_UNICODE_START + 67;
  {$IFDEF UNICODE}
  WM_CAP_SET_MCI_DEVICE           = WM_CAP_SET_MCI_DEVICEW;
  WM_CAP_GET_MCI_DEVICE           = WM_CAP_GET_MCI_DEVICEW;
  {$ELSE}
  WM_CAP_SET_MCI_DEVICE           = WM_CAP_SET_MCI_DEVICEA;
  WM_CAP_GET_MCI_DEVICE           = WM_CAP_GET_MCI_DEVICEA;
  {$ENDIF}

  WM_CAP_STOP                     = WM_CAP_START + 68;
  WM_CAP_ABORT                    = WM_CAP_START + 69;

  WM_CAP_SINGLE_FRAME_OPEN        = WM_CAP_START + 70;
  WM_CAP_SINGLE_FRAME_CLOSE       = WM_CAP_START + 71;
  WM_CAP_SINGLE_FRAME             = WM_CAP_START + 72;

  WM_CAP_PAL_OPENA                = WM_CAP_START + 80;
  WM_CAP_PAL_SAVEA                = WM_CAP_START + 81;
  WM_CAP_PAL_OPENW                = WM_CAP_UNICODE_START + 80;
  WM_CAP_PAL_SAVEW                = WM_CAP_UNICODE_START + 81;
  {$IFDEF UNICODE}
  WM_CAP_PAL_OPEN                 = WM_CAP_PAL_OPENW;
  WM_CAP_PAL_SAVE                 = WM_CAP_PAL_SAVEW;
  {$ELSE}
  WM_CAP_PAL_OPEN                 = WM_CAP_PAL_OPENA;
  WM_CAP_PAL_SAVE                 = WM_CAP_PAL_SAVEA;
  {$ENDIF}

  WM_CAP_PAL_PASTE                = WM_CAP_START + 82;
  WM_CAP_PAL_AUTOCREATE           = WM_CAP_START + 83;
  WM_CAP_PAL_MANUALCREATE         = WM_CAP_START + 84;

  // Following added post VFW 1.1
  WM_CAP_SET_CALLBACK_CAPCONTROL  = WM_CAP_START + 85;

  // Defines end of the message range
  WM_CAP_UNICODE_END              = WM_CAP_PAL_SAVEW;
  WM_CAP_END                      = WM_CAP_UNICODE_END;

type
{ Additional Structs }

  PPOINT = ^POINT;
  POINT = record
    x, y: Integer;
  end;

{ Video Capture Structs }

  PCAPDRIVERCAPS = ^CAPDRIVERCAPS;
  CAPDRIVERCAPS = record
    wDeviceIndex: DWord;
    fHasOverlay,
    fHasDlgVideoSource,
    fHasDlgVideoFormat,
    fHasDlgVideoDisplay,
    fCaptureInitialized,
    fDriverSuppliesPalettes: Boolean;
    hVideoIn, hVideoOut, hVideoExtIn, hVideoExtOut: THandle;  // "0" in Win32
  end;

  PCAPINFOCHUNK = ^CAPINFOCHUNK;
  CAPINFOCHUNK = record
    fccInfoID: DWord;
    lpData: Pointer;
    cbData: Integer;
  end;

  PWAVEFORMATEX = ^WAVEFORMATEX;
  WAVEFORMATEX = record
    wFormatTag,
    nChannels: Word;
    nSamplesPerSec,
    nAvgBytesPerSec: DWord;
    nBlockAlign,
    wBitsPerSample,
    cbSize: Word;
  end;

  BITMAPINFOHEADER = record
   biSize: DWord;
   biWidth,
   biHeight: Integer;
   biPlanes,
   biBitCount: Word;
   biCompression,
   biSizeImage: DWord;
   biXPelsPerMeter,
   biYPelsPerMeter: Integer;
   biClrUsed,
   biClrImportant: DWord;
  end;

  RGBQUAD = record
    rgbBlue, rgbGreen, rgbRed, rgbReserved: Byte;
  end;

  PBITMAPINFO = ^BITMAPINFO;
  BITMAPINFO = record
    bmiHeader: BITMAPINFOHEADER;
    bmiColors: array[0..0of RGBQUAD;
  end;

  PCAPSTATUS = ^CAPSTATUS;
  CAPSTATUS = record
    uiImageWidth,
    uiImageHeight: DWord;
    fLiveWindow,
    fOverlayWindow,
    fScale: Boolean;
    ptScroll: POINT;
    fUsingDefaultPalette,
    fAudioHardware,
    fCapFileExists: Boolean;
    dwCurrentVideoFrame,
    dwCurrentVideoFramesDropped,
    dwCurrentWaveSamples,
    dwCurrentTimeElapsedMS: DWord;
    hPalCurrent: HPALETTE;
    fCapturingNow: Boolean;
    dwReturn,
    wNumVideoAllocated,
    wNumAudioAllocated: DWord;
  end;

  PCAPTUREPARMS = ^CAPTUREPARMS;
  CAPTUREPARMS = record
    dwRequestMicroSecPerFrame: DWord;
    fMakeUserHitOKToCapture: Boolean;
    wPercentDropForError: DWord;
    fYield: Boolean;
    dwIndexSize,
    wChunkGranularity: DWord;
    fUsingDOSMemory: Boolean;
    wNumVideoRequested: DWord;
    fCaptureAudio: Boolean;
    wNumAudioRequested,
    vKeyAbort: DWord;
    fAbortLeftMouse,
    fAbortRightMouse,
    fLimitEnabled: Boolean;
    wTimeLimit: DWord;
    fMCIControl,
    fStepMCIDevice: Boolean;
    dwMCIStartTime,
    dwMCIStopTime: DWord;
    fStepCaptureAt2x: Boolean;
    wStepCaptureAverageFrames,
    dwAudioBufferSize: DWord;
    fDisableWriteCache: Boolean;
    AVStreamMaster: DWord;
  end;

  PVIDEOHDR = ^VIDEOHDR;
  VIDEOHDR = record
    lpData: PByte;
    dwBufferLength,
    dwBytesUsed,
    dwTimeCaptured: DWord;
    dwUser: DWORD_PTR;
    dwFlags: DWord;
    dwReserved: array[0..3of DWORD_PTR;
  end;

  PWAVEHDR = ^WAVEHDR;
  WAVEHDR = record
    lpData: PAnsiChar;
    dwBufferLength,
    dwBytesRecorded: DWord;
    dwUser: DWORD_PTR;
    dwFlags,
    dwLoops: DWord;
    lpNext: PWAVEHDR;
    reserved: DWORD_PTR;
  end;

const
{ VIDEOHDR - dwFlags }

  VHDR_DONE      = 1;
  VHDR_PREPARED  = 2;
  VHDR_INQUEUE   = 4;
  VHDR_KEYFRAME  = 8;
  VHDR_VALID     = $F;

{ WAVEHDR - dwFlags }

  WHDR_DONE      = 1;
  WHDR_PREPARED  = 2;
  WHDR_BEGINLOOP = 4;
  WHDR_ENDLOOP   = 8;
  WHDR_INQUEUE   = $10;

{ TcapErrorCallback, TcapStatusCallback - nID }

  IDS_CAP_BEGIN                = 300;
  IDS_CAP_END                  = 301;

  // Error

  IDS_CAP_INFO                 = 401;
  IDS_CAP_OUTOFMEM             = 402;
  IDS_CAP_FILEEXISTS           = 403;
  IDS_CAP_ERRORPALOPEN         = 404;
  IDS_CAP_ERRORPALSAVE         = 405;
  IDS_CAP_ERRORDIBSAVE         = 406;
  IDS_CAP_DEFAVIEXT            = 407;
  IDS_CAP_DEFPALEXT            = 408;
  IDS_CAP_CANTOPEN             = 409;
  IDS_CAP_SEQ_MSGSTART         = 410;
  IDS_CAP_SEQ_MSGSTOP          = 411;

  IDS_CAP_VIDEDITERR           = 412;
  IDS_CAP_READONLYFILE         = 413;
  IDS_CAP_WRITEERROR           = 414;
  IDS_CAP_NODISKSPACE          = 415;
  IDS_CAP_SETFILESIZE          = 416;
  IDS_CAP_SAVEASPERCENT        = 417;

  IDS_CAP_DRIVER_ERROR         = 418;

  IDS_CAP_WAVE_OPEN_ERROR      = 419;
  IDS_CAP_WAVE_ALLOC_ERROR     = 420;
  IDS_CAP_WAVE_PREPARE_ERROR   = 421;
  IDS_CAP_WAVE_ADD_ERROR       = 422;
  IDS_CAP_WAVE_SIZE_ERROR      = 423;

  IDS_CAP_VIDEO_OPEN_ERROR     = 424;
  IDS_CAP_VIDEO_ALLOC_ERROR    = 425;
  IDS_CAP_VIDEO_PREPARE_ERROR  = 426;
  IDS_CAP_VIDEO_ADD_ERROR      = 427;
  IDS_CAP_VIDEO_SIZE_ERROR     = 428;

  IDS_CAP_FILE_OPEN_ERROR      = 429;
  IDS_CAP_FILE_WRITE_ERROR     = 430;
  IDS_CAP_RECORDING_ERROR      = 431;
  IDS_CAP_RECORDING_ERROR2     = 432;
  IDS_CAP_AVI_INIT_ERROR       = 433;
  IDS_CAP_NO_FRAME_CAP_ERROR   = 434;
  IDS_CAP_NO_PALETTE_WARN      = 435;
  IDS_CAP_MCI_CONTROL_ERROR    = 436;
  IDS_CAP_MCI_CANT_STEP_ERROR  = 437;
  IDS_CAP_NO_AUDIO_CAP_ERROR   = 438;
  IDS_CAP_AVI_DRAWDIB_ERROR    = 439;
  IDS_CAP_COMPRESSOR_ERROR     = 440;
  IDS_CAP_AUDIO_DROP_ERROR     = 441;
  IDS_CAP_AUDIO_DROP_COMPERROR = 442;

  // Status

  IDS_CAP_STAT_LIVE_MODE       = 500;
  IDS_CAP_STAT_OVERLAY_MODE    = 501;
  IDS_CAP_STAT_CAP_INIT        = 502;
  IDS_CAP_STAT_CAP_FINI        = 503;
  IDS_CAP_STAT_PALETTE_BUILD   = 504;
  IDS_CAP_STAT_OPTPAL_BUILD    = 505;
  IDS_CAP_STAT_I_FRAMES        = 506;
  IDS_CAP_STAT_L_FRAMES        = 507;
  IDS_CAP_STAT_CAP_L_FRAMES    = 508;
  IDS_CAP_STAT_CAP_AUDIO       = 509;
  IDS_CAP_STAT_VIDEOCURRENT    = 510;
  IDS_CAP_STAT_VIDEOAUDIO      = 511;
  IDS_CAP_STAT_VIDEOONLY       = 512;
  IDS_CAP_STAT_FRAMESDROPPED   = 513;

{ TcapControlCallback - nState }

  CONTROLCALLBACK_PREROLL   = 1// Waiting to start capture
  CONTROLCALLBACK_CAPTURING = 2// Now capturing

type
{ Video Capture Callbacks }

(*
  hWnd:
    Handle to the capture window associated with the callback function.
  nID:
    Error identification number.
  lpsz:
    Pointer to a textual description of the returned error.
*)

  TcapErrorCallback = function(hWnd: HWND; nID: Integer;
    lpsz: PChar): LRESULT; stdcall;

(*
  hWnd:
    Handle to the capture window associated with the callback function.
  nID:
    Message identification number.
  lpsz:
    Pointer to a textual description of the returned status.
*)

  TcapStatusCallback = function(hWnd: HWND; nID: Integer;
    lpsz: PChar): LRESULT; stdcall;

(*
  hWnd:
    Handle to the capture window associated with the callback function.
*)

  TcapYieldCallback = function(hWnd: HWND): LRESULT; stdcall;

(*
  hWnd:
    Handle to the capture window associated with the callback function.
  lpVHdr:
    Pointer to a VIDEOHDR structure
    containing information about the captured frame.
*)

  TcapVideoStreamCallback = function(hWnd: HWND;
    lpVHdr: PVIDEOHDR): LRESULT; stdcall;

(*
  hWnd:
    Handle to the capture window associated with the callback function.
  lpWHdr:
    Pointer to a WAVEHDR structure
    containing information about the captured audio data.
*)

  TcapWaveStreamCallback = function(hWnd: HWND;
    lpWHdr: PWAVEHDR): LRESULT; stdcall;

(*
  hWnd:
    Handle to the capture window associated with the callback function.
  nState:
    Current state of the capture operation.
*)

  TcapControlCallback = function(hWnd: HWND; nState: Integer): LRESULT; stdcall;

const
  {$IFDEF UNICODE}
  CAP_CREATE_CAPTURE_WINDOW  = 'capCreateCaptureWindowW';
  CAP_GET_DRIVER_DESCRIPTION = 'capGetDriverDescriptionW';
  {$ELSE}
  CAP_CREATE_CAPTURE_WINDOW  = 'capCreateCaptureWindowA';
  CAP_GET_DRIVER_DESCRIPTION = 'capGetDriverDescriptionA';
  {$ENDIF}
  CAP_DESTROY_CAPTURE_WINDOW = 'DestroyWindow';
  CAP_SHOW_CAPTURE_WINDOW    = 'ShowWindow';
  AVI_CAP_32                 = 'Avicap32.dll';
  USER_32                    = 'User32.dll';

{ Additional Functions }

(*
  hwnd:
    Handle to a capture window.
*)

function capDestroyCaptureWindow(hwnd: HWND): Boolean;
  stdcallexternal USER_32 name CAP_DESTROY_CAPTURE_WINDOW;

(*
  hwnd:
    Handle to a capture window.
  bShow:
    Set this parameter to TRUE to show the captured window
    (TRUE = 1 = SW_NORMAL).
    Set this parameter to FALSE to hide the captured window
    (FALSE = 0 = SW_HIDE).
*)

function capShowCaptureWindow(hwnd: HWND; bShow: Boolean): Boolean;
  stdcallexternal USER_32 name CAP_SHOW_CAPTURE_WINDOW;

{ Video Capture Functions }

(*
  lpszWindowName:
    Null-terminated string containing the name used for the capture window.
  dwStyle:
    Window styles used for the capture window.
  x:
    The x-coordinate of the upper left corner of the capture window.
  y:
    The y-coordinate of the upper left corner of the capture window.
  nWidth:
    Width of the capture window.
  nHeight:
    Height of the capture window.
  hWnd:
    Handle to the parent window.
  nID:
    Window identifier. 
*)

function capCreateCaptureWindow(lpszWindowName: PChar; dwStyle: DWord;
  x, y, nWidth, nHeight: Integer; hWnd: HWND; nID: Integer): HWND;
  stdcallexternal AVI_CAP_32 name CAP_CREATE_CAPTURE_WINDOW;

(*
  wDriverIndex:
    Index of the capture driver. The index can range from 0 through 9.
  lpszName:
    Pointer to a buffer containing a null-terminated string
    corresponding to the capture driver name.
  cbName:
    Length, in bytes, of the buffer pointed to by lpszName.
  lpszVer:
    Pointer to a buffer containing a null-terminated string
    corresponding to the description of the capture driver.
  cbVer:
    Length, in bytes, of the buffer pointed to by lpszVer.
*)

function capGetDriverDescription(wDriverIndex: Word; lpszName: PChar;
  cbName: Integer; lpszVer: PChar; cbVer: Integer): Boolean;
  stdcallexternal AVI_CAP_32 name CAP_GET_DRIVER_DESCRIPTION;

{ Video Capture Macros }

function capSetCallbackOnError(hwnd: HWND; fpProc: TcapErrorCallback): Boolean;
function capSetCallbackOnStatus(hwnd: HWND;
  fpProc: TcapStatusCallback): Boolean;
function capSetCallbackOnYield(hwnd: HWND; fpProc: TcapYieldCallback): Boolean;
function capSetCallbackOnFrame(hwnd: HWND;
  fpProc: TcapVideoStreamCallback): Boolean;
function capSetCallbackOnVideoStream(hwnd: HWND;
  fpProc: TcapVideoStreamCallback): Boolean;
function capSetCallbackOnWaveStream(hwnd: HWND;
  fpProc: TcapWaveStreamCallback): Boolean;
function capSetCallbackOnCapControl(hwnd: HWND;
  fpProc: TcapControlCallback): Boolean;

function capSetUserData(hwnd: HWND; lUser: NativeInt): Boolean;
function capGetUserData(hwnd: HWND): NativeInt;

function capDriverConnect(hwnd: HWND; iIndex: NativeInt): Boolean;
function capDriverDisconnect(hwnd: HWND): Boolean;
function capDriverGetName(hwnd: HWND; szName: PChar; wSize: NativeInt): Boolean;
function capDriverGetVersion(hwnd: HWND; szVer: PChar;
  wSize: NativeInt): Boolean;
function capDriverGetCaps(hwnd: HWND; psCaps: PCAPDRIVERCAPS;
  wSize: NativeInt): Boolean;

function capFileSetCaptureFile(hwnd: HWND; szName: PChar): Boolean;
function capFileGetCaptureFile(hwnd: HWND; szName: PChar;
  wSize: NativeInt): Boolean;
function capFileAlloc(hwnd: HWND; dwSize: NativeInt): Boolean;
function capFileSaveAs(hwnd: HWND; szName: PChar): Boolean;
function capFileSetInfoChunk(hwnd: HWND; lpInfoChunk: PCAPINFOCHUNK): Boolean;
function capFileSaveDIB(hwnd: HWND; szName: PChar): Boolean;

function capEditCopy(hwnd: HWND): Boolean;

function capSetAudioFormat(hwnd: HWND; psAudioFormat: PWAVEFORMATEX;
  wSize: NativeInt): Boolean;
function capGetAudioFormat(hwnd: HWND; psAudioFormat: PWAVEFORMATEX;
  wSize: NativeInt): DWord;
function capGetAudioFormatSize(hwnd: HWND): DWord;

function capDlgVideoFormat(hwnd: HWND): Boolean;
function capDlgVideoSource(hwnd: HWND): Boolean;
function capDlgVideoDisplay(hwnd: HWND): Boolean;
function capDlgVideoCompression(hwnd: HWND): Boolean;

function capGetVideoFormat(hwnd: HWND; psVideoFormat: PBITMAPINFO;
  wSize: NativeInt): DWord;
function capGetVideoFormatSize(hwnd: HWND): DWord;
function capSetVideoFormat(hwnd: HWND; psVideoFormat: PBITMAPINFO;
  wSize: NativeInt): Boolean;

function capPreview(hwnd: HWND; f: Boolean): Boolean;
function capPreviewRate(hwnd: HWND; wMS: NativeInt): Boolean;
function capOverlay(hwnd: HWND; f: Boolean): Boolean;
function capPreviewScale(hwnd: HWND; f: Boolean): Boolean;
function capGetStatus(hwnd: HWND; psStatus: PCAPSTATUS;
  wSize: NativeInt): Boolean;
function capSetScrollPos(hwnd: HWND; lpP: PPOINT): Boolean;

function capGrabFrame(hwnd: HWND): Boolean;
function capGrabFrameNoStop(hwnd: HWND): Boolean;

function capCaptureSequence(hwnd: HWND): Boolean;
function capCaptureSequenceNoFile(hwnd: HWND): Boolean;
function capCaptureStop(hwnd: HWND): Boolean;
function capCaptureAbort(hwnd: HWND): Boolean;

function capCaptureSingleFrameOpen(hwnd: HWND): Boolean;
function capCaptureSingleFrameClose(hwnd: HWND): Boolean;
function capCaptureSingleFrame(hwnd: HWND): Boolean;

function capCaptureGetSetup(hwnd: HWND; psCapParms: PCAPTUREPARMS;
  wSize: NativeInt): Boolean;
function capCaptureSetSetup(hwnd: HWND; psCapParms: PCAPTUREPARMS;
  wSize: NativeInt): Boolean;

function capSetMCIDeviceName(hwnd: HWND; szName: PChar): Boolean;
function capGetMCIDeviceName(hwnd: HWND; szName: PChar;
  wSize: NativeInt): Boolean;

function capPaletteOpen(hwnd: HWND; szName: PChar): Boolean;
function capPaletteSave(hwnd: HWND; szName: PChar): Boolean;
function capPalettePaste(hwnd: HWND): Boolean;
function capPaletteAuto(hwnd: HWND; iFrames, iColors: NativeInt): Boolean;
function capPaletteManual(hwnd: HWND; fGrab: Boolean;
  iColors: NativeInt): Boolean;

implementation

const
  {$IFDEF UNICODE}
  SEND_MESSAGE = 'SendMessageW';
  {$ELSE}
  SEND_MESSAGE = 'SendMessageA';
  {$ENDIF}

{ Additional Functions }

function SendMsg(hWnd: HWND; Msg: DWord;
  wParam, lParam: NativeInt): LRESULT; overload;
  stdcallexternal USER_32 name SEND_MESSAGE;

function SendMsg(hWnd: HWND; Msg: DWord; wParam: NativeInt;
  lParam: Pointer): LRESULT; overload;
  stdcallexternal USER_32 name SEND_MESSAGE;

function SendMsgB(hWnd: HWND; Msg: DWord;
  wParam, lParam: NativeInt): Boolean; overload;
  stdcallexternal USER_32 name SEND_MESSAGE;

function SendMsgB(hWnd: HWND; Msg: DWord; wParam: NativeInt;
  lParam: Pointer): Boolean; overload;
  stdcallexternal USER_32 name SEND_MESSAGE;

function SendMsgB(hWnd: HWND; Msg: DWord; wParam: Boolean;
  lParam: NativeInt): Boolean; overload;
  stdcallexternal USER_32 name SEND_MESSAGE;

{ Video Capture Macros }

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the error callback function, of type capErrorCallback.
    Specify NULL for this parameter to disable a previously installed
    error callback function.
*)

function capSetCallbackOnError(hwnd: HWND; fpProc: TcapErrorCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the status callback function, of type capStatusCallback.
    Specify NULL for this parameter to disable a previously installed
    status callback function.
*)

function capSetCallbackOnStatus(hwnd: HWND;
  fpProc: TcapStatusCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the yield callback function, of type capYieldCallback.
    Specify NULL for this parameter to disable a previously installed
    yield callback function.
*)

function capSetCallbackOnYield(hwnd: HWND; fpProc: TcapYieldCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_YIELD, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the preview callback function, of type capVideoStreamCallback.
    Specify NULL for this parameter to disable a previously installed
    callback function.
*)

function capSetCallbackOnFrame(hwnd: HWND;
  fpProc: TcapVideoStreamCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_FRAME, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the video-stream callback function, of type
    capVideoStreamCallback. Specify NULL for this parameter to disable
    a previously installed video-stream callback function.
*)

function capSetCallbackOnVideoStream(hwnd: HWND;
  fpProc: TcapVideoStreamCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the wave stream callback function, of type capWaveStreamCallback.
    Specify NULL for this parameter to disable a previously installed
    wave stream callback function.
*)

function capSetCallbackOnWaveStream(hwnd: HWND;
  fpProc: TcapWaveStreamCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  fpProc:
    Pointer to the callback function, of type capControlCallback .
    Specify NULL for this parameter to disable a previously installed
    callback function.
*)

function capSetCallbackOnCapControl(hwnd: HWND;
  fpProc: TcapControlCallback): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, @fpProc);
end;

(*
  hwnd:
    Handle to a capture window.
  lUser:
    Data value to associate with a capture window.
*)

function capSetUserData(hwnd: HWND; lUser: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_USER_DATA, 0, lUser);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capGetUserData(hwnd: HWND): NativeInt;
begin
  result := SendMsg(hwnd, WM_CAP_GET_USER_DATA, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  iIndex:
    Index of the capture driver. The index can range from 0 through 9.
*)

function capDriverConnect(hwnd: HWND; iIndex: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DRIVER_CONNECT, iIndex, 0);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capDriverDisconnect(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DRIVER_DISCONNECT, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to an application-defined buffer
    used to return the device name as a null-terminated string.
  wSize:
    Size, in bytes, of the buffer referenced by szName.
*)

function capDriverGetName(hwnd: HWND; szName: PChar; wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DRIVER_GET_NAME, wSize, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  szVer:
    Pointer to an application-defined buffer
    used to return the version information as a null-terminated string.
  wSize:
    Size, in bytes, of the application-defined buffer referenced by szVer.
*)

function capDriverGetVersion(hwnd: HWND; szVer: PChar;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DRIVER_GET_VERSION, wSize, szVer);
end;

(*
  hwnd:
    Handle to a capture window.
  psCaps:
    Pointer to the CAPDRIVERCAPS structure to contain the hardware capabilities.
  wSize:
    Size, in bytes, of the structure referenced by psCaps.
*)

function capDriverGetCaps(hwnd: HWND; psCaps: PCAPDRIVERCAPS;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DRIVER_GET_CAPS, wSize, psCaps);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to the null-terminated string
    that contains the name of the capture file to use.
*)

function capFileSetCaptureFile(hwnd: HWND; szName: PChar): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to an application-defined buffer
    used to return the name of the capture file as a null-terminated string.
  wSize:
    Size, in bytes, of the application-defined buffer referenced by szName.
*)

function capFileGetCaptureFile(hwnd: HWND; szName: PChar;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  dwSize:
    Size, in bytes, to create the capture file.
*)

function capFileAlloc(hwnd: HWND; dwSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_FILE_ALLOCATE, 0, dwSize);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to the null-terminated string
    that contains the name of the destination file used to copy the file.
*)

function capFileSaveAs(hwnd: HWND; szName: PChar): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_FILE_SAVEAS, 0, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  lpInfoChunk:
    Pointer to a CAPINFOCHUNK structure
    defining the information chunk to be created or deleted.
*)

function capFileSetInfoChunk(hwnd: HWND; lpInfoChunk: PCAPINFOCHUNK): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_FILE_SET_INFOCHUNK, 0, lpInfoChunk);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to the null-terminated string
    that contains the name of the destination DIB file.
*)

function capFileSaveDIB(hwnd: HWND; szName: PChar): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_FILE_SAVEDIB, 0, szName);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capEditCopy(hwnd: HWND): Boolean;
begin
  Result := SendMsgB(hwnd, WM_CAP_EDIT_COPY, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  psAudioFormat:
    Pointer to a WAVEFORMATEX or PCMWAVEFORMAT structure
    that defines the audio format.
  wSize:
    Size, in bytes, of the structure referenced by psAudioFormat.
*)

function capSetAudioFormat(hwnd: HWND; psAudioFormat: PWAVEFORMATEX;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_AUDIOFORMAT, wSize, psAudioFormat);
end;

(*
  hwnd:
    Handle to a capture window.
  psAudioFormat:
    Pointer to a WAVEFORMATEX structure, or NULL.
    If the value is NULL, the size, in bytes,
    required to hold the structure is returned.
  wSize:
    Size, in bytes, of the structure referenced by psAudioFormat.
*)

function capGetAudioFormat(hwnd: HWND; psAudioFormat: PWAVEFORMATEX;
  wSize: NativeInt): DWord;
begin
  result := SendMsg(hwnd, WM_CAP_GET_AUDIOFORMAT, wSize, psAudioFormat);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capGetAudioFormatSize(hwnd: HWND): DWord;
begin
  result := SendMsg(hwnd, WM_CAP_GET_AUDIOFORMAT, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capDlgVideoFormat(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DLG_VIDEOFORMAT, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capDlgVideoSource(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DLG_VIDEOSOURCE, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capDlgVideoDisplay(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DLG_VIDEODISPLAY, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capDlgVideoCompression(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  psVideoFormat:
    Pointer to a BITMAPINFO structure.
    You can also specify NULL to retrieve the number of bytes
    needed by BITMAPINFO.
  wSize:
    Size, in bytes, of the structure referenced by psVideoFormat.
*)

function capGetVideoFormat(hwnd: HWND; psVideoFormat: PBITMAPINFO;
  wSize: NativeInt): DWord;
begin
  result := SendMsg(hwnd, WM_CAP_GET_VIDEOFORMAT, wSize, psVideoFormat);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capGetVideoFormatSize(hwnd: HWND): DWord;
begin
  result := SendMsg(hwnd, WM_CAP_GET_VIDEOFORMAT, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  psVideoFormat:
    Pointer to a BITMAPINFO structure.
  wSize:
    The size, in bytes, of the structure referenced by psVideoFormat.
*)

function capSetVideoFormat(hwnd: HWND; psVideoFormat: PBITMAPINFO;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_VIDEOFORMAT, wSize, psVideoFormat);
end;

(*
  hwnd:
    Handle to a capture window.
  f:
    Preview flag. Specify TRUE for this parameter to enable preview mode
    or FALSE to disable it.
*)

function capPreview(hwnd: HWND; f: Boolean): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_PREVIEW, f, 0);
end;

(*
  hwnd:
    Handle to a capture window.
  wMS:
    Rate, in milliseconds, at which new frames are captured and displayed.
*)

function capPreviewRate(hwnd: HWND; wMS: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0);
end;

(*
  hwnd:
    Handle to a capture window.
  f:
    Overlay flag. Specify TRUE for this parameter to enable overlay mode
    or FALSE to disable it.
*)

function capOverlay(hwnd: HWND; f: Boolean): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_OVERLAY, f, 0);
end;

(*
  hwnd:
    Handle to a capture window.
  f:
    Preview scaling flag. Specify TRUE for this parameter to stretch
    preview frames to the size of the capture window or FALSE to display
    them at their natural size.
*)

function capPreviewScale(hwnd: HWND; f: Boolean): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_SCALE, f, 0);
end;

(*
  hwnd:
    Handle to a capture window.
  psStatus:
    Pointer to a CAPSTATUS structure.
  wSize:
    Size, in bytes, of the structure referenced by psStatus.
*)

function capGetStatus(hwnd: HWND; psStatus: PCAPSTATUS;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_GET_STATUS, wSize, psStatus);
end;

(*
  hwnd:
    Handle to a capture window.
  lpP:
    Address to contain the desired scroll position.
*)

function capSetScrollPos(hwnd: HWND; lpP: PPOINT): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_SCROLL, 0, lpP);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capGrabFrame(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_GRAB_FRAME, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capGrabFrameNoStop(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_GRAB_FRAME_NOSTOP, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureSequence(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SEQUENCE, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureSequenceNoFile(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SEQUENCE_NOFILE, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureStop(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_STOP, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureAbort(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_ABORT, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureSingleFrameOpen(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SINGLE_FRAME_OPEN, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureSingleFrameClose(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SINGLE_FRAME_CLOSE, 00);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capCaptureSingleFrame(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SINGLE_FRAME, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  psCapParms:
    Pointer to a CAPTUREPARMS structure.
  wSize:
    Size, in bytes, of the structure referenced by psCapParms.
*)

function capCaptureGetSetup(hwnd: HWND; psCapParms: PCAPTUREPARMS;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, psCapParms);
end;

(*
  hwnd:
    Handle to a capture window.
  psCapParms:
    Pointer to a CAPTUREPARMS structure.
  wSize:
    Size, in bytes, of the structure referenced by psCapParms.
*)

function capCaptureSetSetup(hwnd: HWND; psCapParms: PCAPTUREPARMS;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, psCapParms);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to a null-terminated string containing the name of the device.
*)

function capSetMCIDeviceName(hwnd: HWND; szName: PChar): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_SET_MCI_DEVICE, 0, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to a null-terminated string that contains the MCI device name.
  wSize:
    Length, in bytes, of the buffer referenced by szName.
*)

function capGetMCIDeviceName(hwnd: HWND; szName: PChar;
  wSize: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_GET_MCI_DEVICE, wSize, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to a null-terminated string containing the palette filename.
*)

function capPaletteOpen(hwnd: HWND; szName: PChar): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_PAL_OPEN, 0, szName);
end;

(*
  hwnd:
    Handle to a capture window.
  szName:
    Pointer to a null-terminated string containing the palette filename.
*)

function capPaletteSave(hwnd: HWND; szName: PChar): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_PAL_SAVE, 0, szName);
end;

(*
  hwnd:
    Handle to a capture window.
*)

function capPalettePaste(hwnd: HWND): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_PAL_PASTE, 00);
end;

(*
  hwnd:
    Handle to a capture window.
  iFrames:
    Number of frames to sample.
  iColors:
    Number of colors in the palette.
    The maximum value for this parameter is 256.
*)

function capPaletteAuto(hwnd: HWND; iFrames, iColors: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors);
end;

(*
  hwnd:
    Handle to a capture window.
  fGrab:
    Palette histogram flag. Set this parameter to TRUE for each frame
    included in creating the optimal palette. After the last frame has been
    collected, set this parameter to FALSE to calculate the optimal palette
    and send it to the capture driver.
  iColors:
    Number of colors in the palette.
    The maximum value for this parameter is 256.
    This value is used only during collection of the first frame in a sequence.
*)

function capPaletteManual(hwnd: HWND; fGrab: Boolean;
  iColors: NativeInt): Boolean;
begin
  result := SendMsgB(hwnd, WM_CAP_PAL_MANUALCREATE, fGrab, iColors);
end;

end.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)