Форум программистов, компьютерный форум CyberForum.ru

Воспроизведение видео в окне с известным Handle - C++

Восстановить пароль Регистрация
 
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
13.08.2013, 18:01     Воспроизведение видео в окне с известным Handle #1
Всем привет.
Необходимо вывести видео в окно, handle которого известен. Насколько я понимаю, есть несколько путей решения:
1. DirectShow
2. Microsoft Media Foundation
3. Нечто самописное
Хотелось бы выслушать мнения по этому поводу, что лучше/предпочтительнее. Может быть, у кого-то есть подобный опыт и он подскажет наиболее простое решение?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
13.08.2013, 18:31     Воспроизведение видео в окне с известным Handle #2
когда то делал вот держи(что бы выбрать фильм и воспроизвести нажми пробел)
Вложения
Тип файла: rar Project1.rar (8.1 Кб, 32 просмотров)
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
21.08.2013, 19:02  [ТС]     Воспроизведение видео в окне с известным Handle #3
Цитата Сообщение от Игорь с++ Посмотреть сообщение
когда то делал вот держи(что бы выбрать фильм и воспроизвести нажми пробел)
Честно говоря, многого не понял. Хотя сам код вроде бы элементарный...
Несколько вопросов:
1) В методе InitVideoControl происходит создание нового окна MCIWndCreate(...). Однако воспроизведение видео происходит в главном окне.
2) На правую кнопку мыши открывается меню. Где оно описано?
3) И наконец, главный вопрос: как мне передать MCI имя своего файла и сделать так, чтобы он воспоизвелся в моем (не новом) окне?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
21.08.2013, 19:32     Воспроизведение видео в окне с известным Handle #4
Цитата Сообщение от Inflight Посмотреть сообщение
Несколько вопросов
читаем msdn и все вопросы уходят сами по себе
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
22.08.2013, 18:10  [ТС]     Воспроизведение видео в окне с известным Handle #5
Цитата Сообщение от Игорь с++ Посмотреть сообщение
читаем msdn и все вопросы уходят сами по себе
Отлично, я добился, чтобы видео воспроизводилось в моём окне. И всё здорово в оконном режиме, видео воспроизводится, перекрывая всё, что есть в окне.
Однако в полноэкранном режиме всё не так хорошо: видео вроде запускается, но его не видно, виден чёрный экран. Я делал и SetActiveWindow, и InvalidateRect, и UpdateWindow, и SetForegroundWindow, и SetFocus. И всё это и для handle основного окна, и для handle видео. В чём может быть беда?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
22.08.2013, 19:01     Воспроизведение видео в окне с известным Handle #6
Проблемы быть не должно если Вы не где не накосячили.
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
22.08.2013, 20:18  [ТС]     Воспроизведение видео в окне с известным Handle #7
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Проблемы быть не должно если Вы не где не накосячили.
Забавно, что при переходе из полноэкранного режима в оконный через Alt-Tab видео в окошке показывается. При переходе обратно опять слышен только звук. Где я мог ошибиться?
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
s3eResult s3eWinAPIPlayVideo_platform()
{
    HWND hWnd = s3eEdkGetHwnd();
 
    ghMciWindow = MCIWndCreate(s3eEdkGetHwnd(), ghInstance, MCIWNDF_NOPLAYBAR, _T("c:\\intro.mpg"));
        
    if(MCIWndCanPlay(ghMciWindow))
           {
        MCIWndPlay(ghMciWindow);
    }
    ShowWindow(ghMciWindow, SW_SHOWMAXIMIZED);
    UpdateWindow(ghMciWindow);
    SetForegroundWindow(ghMciWindow);
    SetFocus(ghMciWindow);
    mciSendString(L"play fullscreen", NULL, 0, s3eEdkGetHwnd());
 
    InvalidateRect(s3eEdkGetHwnd(), 0 , true);
    SetActiveWindow(s3eEdkGetHwnd());
    UpdateWindow(s3eEdkGetHwnd());
    SetForegroundWindow(s3eEdkGetHwnd());
    SetFocus(s3eEdkGetHwnd());
 
    return S3E_RESULT_SUCCESS;
}
Добавлено через 41 минуту
Ну и вопрос в догонку: когда я во время воспроизведения выбираю пункт меню "отправить команду" и ввожу "play fullscreen", видео разворачивается на полный экран. Но когда я пишу в коде
C++
1
mciSendString(L"play fullscreen", NULL, NULL, ghMciWindow);
ничего не происходит?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
22.08.2013, 22:47     Воспроизведение видео в окне с известным Handle #8
честно не знаю где косяк , но попробуй такой способ - узнай разрешение экрана (програмно) и тупо растени окно на сколько надо
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
23.08.2013, 14:04  [ТС]     Воспроизведение видео в окне с известным Handle #9
Вот это сработало:
C++
1
mciSendString(L"play c:\\intro.mpg fullscreen", NULL, NULL, ghMciWindow);
Добавлено через 2 часа 45 минут
Цитата Сообщение от Игорь с++ Посмотреть сообщение
честно не знаю где косяк , но попробуй такой способ - узнай разрешение экрана (програмно) и тупо растени окно на сколько надо
А при таком способе будет видна рамка или title окна с видео? Хочется, чтобы нет.
Просто когда я делаю mciSendString(L"play c:\\intro.mpg fullscreen", NULL, NULL, ghMciWindow), то не могу перехватить сообщения о нажатии клавиш (чтобы завершить видео).
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
23.08.2013, 14:36     Воспроизведение видео в окне с известным Handle #10
рамка не будет видна . а по поводу что не можеш отлавить нажатие, смотри в сторону сабкласинг. код показать пока не могу с телефона сижу,если хочеш вечером покажу.
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
23.08.2013, 19:30  [ТС]     Воспроизведение видео в окне с известным Handle #11
Цитата Сообщение от Игорь с++ Посмотреть сообщение
рамка не будет видна . а по поводу что не можеш отлавить нажатие, смотри в сторону сабкласинг. код показать пока не могу с телефона сижу,если хочеш вечером покажу.
Был бы очень признателен)

Добавлено через 1 час 46 минут
И кстати, как сделать полный экран без рамки? Я пытался
mciSendString(L"put movie window at 0 0 1920 1080", 0, 0, 0);
но видна и рамка, и заголовок.

Добавлено через 2 часа 34 минуты
ОК, вроде сделал без рамки, реагирует на нажатия, но тут другая напасть...
Дело в том, что основное приложение, вызывая новое окно с видео, остаётся "наверху". Видео хоть и запускается, но в неактивном окне и его не видно. Если переключить через Alt-Tab, то всё ОК.
SetActive, SetForeground и иже с ними не помогли. Видимо, дело в gwStyle окон. Какие должны быть стили для корректной работы?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
23.08.2013, 21:58     Воспроизведение видео в окне с известным Handle #12
так сделай SetParent и всё , вообщем смотри там и сабкласинг и остальное
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
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
#include <windows.h>
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
WNDPROC DefProc;
 
HWND hw;
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
LRESULT CALLBACK NewProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
static char a[2];
        
    switch(message)
    {
 
case WM_CHAR:
     
     if(wParam==27){PostQuitMessage (0);}
        
        else{
       
       a[0]=CHAR(wParam);
             
             MessageBoxA(hwnd,a,"",MB_OK);
             
             }
        
    }
    return((LRESULT)CallWindowProc((WNDPROC)DefProc,hwnd,message,wParam,lParam));
}
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
           
           case WM_CREATE:
                
    mciSendString("open C:\\1.wmv type mpegvideo alias myFile",0, 0, hwnd);
 mciSendString("play myFile ", 0,0, hwnd);
           
 hw=FindWindow(NULL,"C:\\1.wmv");
 
 DefProc = (WNDPROC)GetWindowLongPtr(hw,GWLP_WNDPROC);
            SetWindowLongPtr(hw,GWLP_WNDPROC,(LPARAM)NewProc);
 
SetParent(hw,hwnd);
          
                break;
           
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
26.08.2013, 19:49  [ТС]     Воспроизведение видео в окне с известным Handle #13
Цитата Сообщение от Игорь с++ Посмотреть сообщение
так сделай SetParent и всё , вообщем смотри там и сабкласинг и остальное
Увы, SetParent не помог. Сабклассинг ок, появился ещё вопрос: как нейтрализовать появляющееся по клику правой кнопи мыши меню? Тоже через сабклассинг?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
26.08.2013, 21:53     Воспроизведение видео в окне с известным Handle #14
Цитата Сообщение от Inflight Посмотреть сообщение
как нейтрализовать появляющееся по клику правой кнопи мыши меню? Тоже через сабклассинг?
Ага .
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LRESULT CALLBACK NewProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
 
    switch(message)
    {
 
case WM_RBUTTONDOWN:
 
    return 0;
 
    break;
 
    }
    return((LRESULT)CallWindowProc((WNDPROC)DefProc,hwnd,message,wParam,lParam));
}
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
27.08.2013, 11:45  [ТС]     Воспроизведение видео в окне с известным Handle #15
Огромное спасибо за ответы, практически всё получилось. Осталась одна неприятность - чёрный экран. Чтобы увидеть видео, надо нажать Alt-Tab, хотя фокус у окна с видео есть, работают сочетания Ctrl-S и Ctrl-P.
Пробовал и SetParent в разных комбинациях, и SetActive, SetForeground, UpdateWindow - ничего не помогает. Мистика какая-то! Есть может какой-нибудь способ принудительно показывать видео?
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
27.08.2013, 13:14     Воспроизведение видео в окне с известным Handle #16
покажи часть кода где воспроизводишь , что бы я мог повторить эту беду.вечером гляну.
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
27.08.2013, 14:50  [ТС]     Воспроизведение видео в окне с известным Handle #17
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
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
s3eResult s3eWinAPIPlayVideo_platform() // вызываемая из главного окна функция
{
    if (WinMain(s3eEdkGetHinstance(), NULL, NULL, SW_SHOWMAXIMIZED) == 0)
        return S3E_RESULT_SUCCESS;
    else 
        return S3E_RESULT_ERROR;
}
 
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
                   /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    ghInstance = hThisInstance;
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = CreateSolidBrush(RGB(255,0,0));
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           L"Intro",       /* Title Text */
           WS_POPUP, /* default window, POPUP наше всё!*/
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           s3eEdkGetHwnd(),        /* The window is a child-window to Marmalade */
           //HWND_DESKTOP,        /* The window is a child-window to Marmalade */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    ghMciWindow = MCIWndCreate(hwnd, ghInstance, MCIWNDF_NOPLAYBAR, _T("c:\\intro.mpg"));
    if(MCIWndCanPlay(ghMciWindow))
    {
        MCIWndPlay(ghMciWindow);
    }
    SetParent(ghMciWindow, hwnd);
    MoveWindow(ghMciWindow, 0 , 0, 1920, 1080, FALSE); 
 
    SendMessage(s3eEdkGetHwnd(),WM_SYSCOMMAND,SC_MINIMIZE,0); // пытаюсь свернуть главное окно
 
    InvalidateRect(s3eEdkGetHwnd(), 0 , true);
    InvalidateRect(hwnd, 0 , true);
    InvalidateRect(ghMciWindow, 0 , true);
 
    ShowWindow(hwnd, SW_MAXIMIZE);
    SetActiveWindow(hwnd);
    UpdateWindow(hwnd);
    SetForegroundWindow(hwnd);
    SetFocus(hwnd);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 20:20     Воспроизведение видео в окне с известным Handle
Еще ссылки по теме:

Вычисления по известным формулам C++
Как сделать издателя известным для компьютера? C++
Воспроизведение видео из сети C++
Циклы с известным числом повторений C++
C++ Функции и алгоритмы с известным результатом

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

Или воспользуйтесь поиском по форуму:
Игорь с++
 Аватар для Игорь с++
431 / 454 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
27.08.2013, 20:20     Воспроизведение видео в окне с известным Handle #18
Inflight, Короче смотри для того , что бы работало на весь экран и обратно стиль у главного окна должен быть - WS_POPUP и к тому же пришлось изобретать грабли ( сразу говорю я не знаю почему это так работает , точнее не работает ) , при этом стиле убирается верхняя шапка окна , поэтому если ты хочеш обрабатывать свернуть и тп , то тебе придётся делать это всё в ручную . Вот что получилось у меня ( что бы окно можно было раздвинуть на весь экран - щёлкни дважды левой кнопкой мыши на видео , обратно так же ) . Да и ещё передвижение окна я уже сделал за тебя ( передвигать можешь как и обычное окно с шапкой ) . Открывать видео так же пробел .
Вложения
Тип файла: rar Project1.rar (12.5 Кб, 13 просмотров)
Yandex
Объявления
27.08.2013, 20:20     Воспроизведение видео в окне с известным Handle
Ответ Создать тему
Опции темы

Текущее время: 04:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru