質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6758閲覧

Win32APIを用いた動画として映るデスクトップキャプチャのプログラミングについて

watarusugimoto

総合スコア47

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/12/11 22:47

###デスクトップキャプチャを行い、その画像をOpenCVで画像解析したい
前段として、Win32APIを用いてデスクトップキャプチャのみのプログラムを作成しました。
これが完成したら、OpenCVへビットマップを渡してそれを解析するという方法を取ろうと考えています。

このプログラミングで動きますがちらつきが生じています。
このような方法でデスクトップキャプチャをすることで良いのか聞きたいと思います。
より効率的な方法がありましたら教えてください。

###該当のソースコード

C++

1 2#include <windows.h> 3 4TCHAR szClassName[] = TEXT("text01"); //TCHARはUNICODEとASCIIに対応するためのマクロ 5 6//ウィンドウプロシージャ(コールバック関数) 7LRESULT CALLBACK WndProc 8( 9 HWND hWnd, //親ウィンドウのハンドル 10 UINT msg, // 11 WPARAM wp, // 12 LPARAM lp //アプリケーションで定義された値 13) 14{ 15 HDC hdc; 16 PAINTSTRUCT ps; 17 static BITMAPINFO bmpInfo; 18 static LPDWORD lpPixel; 19 static HBITMAP hBitmap; 20 static HDC hMemDC; 21 22 HWND desktop; 23 RECT rc; 24 static int width, height; 25 26 switch (msg) 27 { 28 case WM_CREATE: 29 //スクリーンの情報を得る 30 desktop = GetDesktopWindow(); 31 GetWindowRect(desktop, &rc); 32 width = rc.right; 33 height = rc.bottom; 34 35 //DIBの情報を設定する 36 bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 37 bmpInfo.bmiHeader.biWidth = width; 38 bmpInfo.bmiHeader.biHeight = height; 39 bmpInfo.bmiHeader.biPlanes = 1; 40 bmpInfo.bmiHeader.biBitCount = 32; 41 bmpInfo.bmiHeader.biCompression = BI_RGB; 42 43 //DIBSection作成 44 //親ウィンドウのハンドルからデバイスコンテキストを取得 45 hdc = GetDC(hWnd); 46 //DIBの作成 47 hBitmap = CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0); 48 //メモリデバイスコンテキストの作成 49 hMemDC = CreateCompatibleDC(hdc); 50 SelectObject(hMemDC, hBitmap); 51 ReleaseDC(hWnd, hdc); 52 53 //スクリーンをDIBSectionにコピー 54 hdc = GetDC(desktop); 55 BitBlt(hMemDC, 0, 0, width, height, hdc, 0, 0, SRCCOPY); 56 ReleaseDC(desktop, hdc); 57 58 //ウィンドウを一度再描画のために無効空間を発生させる 59 InvalidateRect(hWnd,NULL,TRUE); 60 61 return 0; 62 63 case WM_DESTROY: 64 DeleteDC(hMemDC); 65 DeleteObject(hBitmap);//BMPを削除した時、lpPixelも自動的に開放される 66 PostQuitMessage(0); 67 68 return 0; 69 70 case WM_PAINT: 71 //再度desktopを取得 72 desktop = GetDesktopWindow(); 73 //デバイスコンテキストハンドルを取得 74 hdc = GetDC(desktop); 75 //hMemDCへコピー 76 BitBlt(hMemDC, 0, 0, width, height, hdc, 0, 0, SRCCOPY); 77 ReleaseDC(desktop, hdc); 78 79 hdc = BeginPaint(hWnd, &ps); 80 //表画面へ転送 81 BitBlt(hdc, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY); 82 EndPaint(hWnd, &ps); 83 84 //無効空間を発生させてさらにWM_PAINTを呼び出す。 85 InvalidateRect(hWnd, NULL, TRUE); 86 87 return 0; 88 } 89 return DefWindowProc(hWnd,msg,wp,lp); 90} 91 92 93//ウィンドウクラスの登録 94ATOM InitApp(HINSTANCE hInst) 95{ 96 WNDCLASSEX wc; 97 wc.cbSize = sizeof(WNDCLASSEX); //構造体のサイズ 98 wc.style = CS_HREDRAW | CS_VREDRAW; //クラスのスタイル 99 wc.lpfnWndProc = WndProc; //プロシージャ名 100 wc.cbClsExtra = 0; //補助メモリ 101 wc.cbWndExtra = 0; //補助メモリ 102 wc.hInstance = hInst; //インスタンス 103 wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); //アイコン 104 wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); //カーソル 105 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景ブラシ 106 wc.lpszMenuName = NULL; //メニュー名 107 wc.lpszClassName = szClassName; //クラス名 108 wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); //小さいアイコン 109 110 return(RegisterClassEx(&wc)); 111} 112 113 114//ウィンドウの生成 115BOOL InitInstance(HINSTANCE hInst, int nCmdShow) 116{ 117 HWND hWnd; 118 119 hWnd = CreateWindow 120 ( 121 szClassName, //クラス名 122 TEXT("猫でもわかるWindowsプログラミング"), //ウィンドウ名 123 WS_OVERLAPPEDWINDOW, //ウィンドウスタイル 124 CW_USEDEFAULT, //x位置 125 CW_USEDEFAULT, //y位置 126 CW_USEDEFAULT, //ウィンドウ幅 127 CW_USEDEFAULT, //ウィンドウ高さ 128 NULL, //親ウィンドウのハンドル 親を作るときはNULL 129 NULL, //メニューハンドル クラスメニューを使うときはNULL 130 hInst, //インスタンスハンドル 131 NULL //ウィンドウ作成データ 132 ); 133 if (!hWnd) 134 return FALSE; 135 ShowWindow(hWnd, nCmdShow); 136 UpdateWindow(hWnd); 137 return TRUE; 138} 139 140 141//Windowsプログラムのエントリーポイント 142int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) 143{ 144 MSG msg; 145 BOOL bRet; 146 147 if (!InitApp(hCurInst)) 148 return FALSE; 149 150 if (!InitInstance(hCurInst, nCmdShow)) 151 return FALSE; 152 153 //メッセージを取得 154 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) 155 { 156 if (bRet == -1) 157 { 158 break; 159 } 160 else 161 { 162 TranslateMessage(&msg); //メッセージを変換 163 DispatchMessage(&msg); //メッセージを送出 164 } 165 } 166 return (int)msg.wParam; 167}

###試したこと
ウィンドウを作成した直後に、全画面について無効領域を作り、WM_PAINTというメッセージを発生させています。
WM_PAINT内でも、さらに全画面で無効領域を発生させ、WM_PAINTというメッセージを発生させ、WM_PAINTのループを作ることで動画として映るデスクトップキャプチャを作成しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WM_PAINT内でも、さらに全画面で無効領域を発生させ、WM_PAINTというメッセージを発生させ

↑ これがちらつく理由です。

WM_TIMER などタイマーを利用して、画像を取得するように変えてみてください。

投稿2016/12/11 23:58

編集2016/12/12 00:06
qt6hy

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2016/12/12 07:18

ありがとうございます。 WM_TIMERを使ったプログラミングに変更し、再度新たに質問させていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問