Guest User

Untitled

a guest
Jan 13th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. #define UNICODE
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include <dshow.h>
  6. #include <thread>
  7. #include "comptr.h"
  8.  
  9. #pragma comment(lib, "strmiids.lib")
  10. #pragma comment(lib, "ole32.lib")
  11.  
  12. struct CoInitializeRAII {
  13. CoInitializeRAII() {CoInitialize(nullptr);}
  14. ~CoInitializeRAII() {CoUninitialize();}
  15. };
  16.  
  17. DxUtil::ComPtr<IVMRWindowlessControl> InitWindowlessVMR(HWND hwnd, const DxUtil::ComPtr<IGraphBuilder> &graphBuilder) {
  18. if (!graphBuilder) {
  19. return nullptr;
  20. }
  21.  
  22. HRESULT hr;
  23.  
  24. DxUtil::ComPtr<IBaseFilter> baseFilter;
  25.  
  26. if (FAILED(hr = CoCreateInstance(CLSID_VideoMixingRenderer, nullptr, CLSCTX_INPROC, IID_IBaseFilter, reinterpret_cast<void **>(baseFilter.address())))) {
  27. std::cout << "Creating IBaseFilter failed: " << hr << "\n";
  28. return nullptr;
  29. }
  30.  
  31. if (FAILED(hr = graphBuilder->AddFilter(baseFilter.get(), L"Video Mixing Renderer"))) {
  32. std::cout << "AddFilter() failed: " << hr << "\n";
  33. return nullptr;
  34. }
  35.  
  36. DxUtil::ComPtr<IVMRFilterConfig> filterConfig;
  37. if (FAILED(hr = baseFilter->QueryInterface(IID_IVMRFilterConfig, reinterpret_cast<void **>(filterConfig.address())))) {
  38. std::cout << "Creating IVMRFilterConfig failed: " << hr << "\n";
  39. return nullptr;
  40. }
  41.  
  42. if (FAILED(hr = filterConfig->SetRenderingMode(VMRMode_Windowless))) {
  43. std::cout << "SetRenderingMode() failed: " << hr << "\n";
  44. return nullptr;
  45. }
  46.  
  47. DxUtil::ComPtr<IVMRWindowlessControl> windowlessControl;
  48. if (FAILED(hr = baseFilter->QueryInterface(IID_IVMRWindowlessControl, reinterpret_cast<void **>(windowlessControl.address())))) {
  49. std::cout << "Creating IVMRWindowlessControl failed: " << hr << "\n";
  50. return nullptr;
  51. }
  52.  
  53. if (FAILED(hr = windowlessControl->SetVideoClippingWindow(hwnd))) {
  54. std::cout << "SetVideoClippingWindow() failed: " << hr << "\n";
  55. return nullptr;
  56. }
  57.  
  58. return windowlessControl;
  59. }
  60.  
  61. int PlayInWindow(HWND hwnd) {
  62. const std::wstring fileName = L"F:/Heyayayay.avi";
  63.  
  64. //HWND hwnd = FindWindowA(className.c_str(), nullptr);
  65.  
  66. if (!hwnd) {
  67. std::cout << "Window not found.\n";
  68. return 1;
  69. }
  70.  
  71. CoInitializeRAII coInit;
  72. HRESULT hr;
  73.  
  74. DxUtil::ComPtr<IGraphBuilder> graphBuilder;
  75. if (FAILED(hr = CoCreateInstance(CLSID_FilterGraph, nullptr, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, reinterpret_cast<void **>(graphBuilder.address())))) {
  76. std::cout << "Creating IGraphBuilder failed: " << hr << "\n";
  77. return 1;
  78. }
  79.  
  80. auto windowlessControl = InitWindowlessVMR(hwnd, graphBuilder);
  81. if (!windowlessControl) {
  82. std::cout << "Windowless control creation failed.\n";
  83. return 1;
  84. }
  85.  
  86. RECT src = { 0, 0 };
  87. windowlessControl->GetNativeVideoSize(&src.right, &src.bottom, nullptr, nullptr);
  88.  
  89. RECT dest;
  90. GetClientRect(hwnd, &dest);
  91. dest.left = 0;
  92.  
  93. windowlessControl->SetVideoPosition(&src, &dest);
  94.  
  95. DxUtil::ComPtr<IMediaControl> mediaControl;
  96. if (FAILED(hr = graphBuilder->QueryInterface(IID_IMediaControl, reinterpret_cast<void **>(mediaControl.address())))) {
  97. std::cout << "Creating IMediaControl failed: " << hr << "\n";
  98. return 1;
  99. }
  100.  
  101. DxUtil::ComPtr<IMediaEvent> mediaEvent;
  102. if (FAILED(hr = graphBuilder->QueryInterface(IID_IMediaEvent, reinterpret_cast<void **>(mediaEvent.address())))) {
  103. std::cout << "Creating IMediaEvent failed: " << hr << "\n";
  104. return 1;
  105. }
  106.  
  107. if (FAILED(hr = graphBuilder->RenderFile(fileName.c_str(), nullptr))) {
  108. std::cout << "RenderFile() failed: " << hr << "\n";
  109. return 1;
  110. }
  111.  
  112. if (FAILED(hr = mediaControl->Run())) {
  113. std::cout << "Run() failed: " << hr << "\n";
  114. return 1;
  115. }
  116.  
  117. long code;
  118. if (FAILED(hr = mediaEvent->WaitForCompletion(INFINITE, &code))) {
  119. std::cout << "WaitForCompletion() failed: " << hr << "\n";
  120. return 1;
  121. }
  122. }
  123.  
  124. /*BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam) {
  125. if (IsWindowVisible(hWnd)) {
  126. std::thread t(PlayInWindow, hWnd);
  127. return FALSE;
  128. }
  129. return TRUE;
  130. }*/
  131.  
  132.  
  133. int main() {
  134. //EnumWindows(EnumWindowsProc, NULL);
  135. PlayInWindow(FindWindow(nullptr, L"PuTTY Configuration"));
  136. // std::thread t1(PlayInWindow, FindWindow(L"Notepad", nullptr));
  137. // std::thread t2(PlayInWindow, FindWindow(L"CalcFrame", nullptr));
  138. system("pause");
  139. }
Advertisement
Add Comment
Please, Sign In to add comment