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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Q&A

解決済

1回答

3036閲覧

C++でウィンドウをpngで保存したい

minimize

総合スコア23

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

0グッド

0クリップ

投稿2018/11/01 17:01

c++でフォアグラウンドウィンドウのハンドルを取得することはできたのですが、
これを使ってこのウィンドウをpngで保存したいのですけど、
クライアント領域の画像は取得することはできますでしょうか?

コードは現在はこのようになっております。

C++

1#include <stdio.h> 2#include <iostream> 3#include <string.h> 4#include <cstdlib> 5#include <windows.h> 6 7#define _WIN32_WINNT 8 9int DoGetActiveWindow() 10{ 11 char buf[1000]; 12 HWND hWnd; 13 14 15 /* アクティブウィンドウの取得 */ 16 hWnd = GetForegroundWindow(); 17 18 GetWindowText(hWnd, buf, 1000); 19 20 LPARAM lParam = (LPARAM)"ResearchProject"; 21 22 if(strcmp(buf,(char*)lParam)==0){//名前が一致したら、 23 24 std::cout << buf << std::endl; 25 26 return 1; 27 28 }else{ 29 return 0; 30 } 31 32 if(hWnd == NULL){ 33 std::cout << "not handle" << std::endl; 34 return 0; 35 } 36 37 return 0; 38} 39 40DWORD WINAPI call_system(LPVOID arg){ 41 system("C:\Users\mimimi\Desktop\nana\ResearchProject"); 42} 43 44int main(){ 45 int c = 0; 46 HANDLE hThread; 47 DWORD dwThreadId; 48 49 hThread = CreateThread( //スレッドの起動 50 NULL, 51 0, 52 call_system, 53 NULL, 54 0, 55 &dwThreadId); 56 57 Sleep(2000); 58 59 int i = DoGetActiveWindow(); 60 61 62 if(i == 0){ 63 std::cout << "Not Active" << std::endl; 64 DoGetActiveWindow(); 65 }else if(i == 1){ 66 std::cout << "OKOKOK" << std::endl; 67 return 0; 68 } 69 70 return 0; 71} 72

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず問題点から
CreateThread(OSの機能)で作ったスレッドからC言語の標準関数(ライブラリの機能)を呼び出すのは問題があります。

CreateProcessShellExecuteExを用いるか_beginthread/_beginthreadexを用いてください。


c++

1// 使い終わったらDeleteObjectする事 2HBITMAP GetBitmap(HWND hwnd){ 3 RECT rec; 4 GetClientRect(hwnd, &rec); 5 auto width = rec.right - rec.left; 6 auto height = rec.bottom - rec.top; 7 8 auto hdcSrc = GetDC(NULL); // desktop dc 9 auto hdcDst = CreateCompatibleDC(hdcSrc); 10 HBITMAP hbmp = CreateCompatibleBitmap(hdcSrc, width, height); 11 auto hOldBmp = SelectObject(hdcDst, hbmp); 12 13 BitBlt(hdcDst, 14 0,0,width,height, 15 hdcSrc, 16 rec.left,rec.top, 17 SRCCOPY 18 ); 19 20 // 後片付け 21 SelectObject(hdcDst, hOldBmp); 22 DeleteDC(hdcDst); 23 ReleaseDC(hwnd, hdcSrc); 24 25 return hbmp; 26}

領域がずれてたらDwmGetWindowAttributeでググって適当に直してください

あとは、bmpに保存する場合等を参考に

投稿2018/11/02 00:29

asm

総合スコア15147

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

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

minimize

2018/11/05 04:16

ありがとうございます! bmpに保存する場合のところのコードがエラーが出てるので頑張ってなおします????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問