Print Screen c++

Vocë só pede coisas complicadas :slight_smile:
http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen

Não teria algum exemplo mais simples?

É que isso é complicado mesmo.

É por isso também que recomendamos usar um toolkit como o Qt, já que qualquer coisinha usando só a API do Windows - mesmo que seja para desenhar um label com fonte diferente do padrão - é desnecessariamente complicada.

E será q há algum comando do prompt q seja capaz de tirar print screen?

Vou fazer uma perguntinha bem bobinha. Por “print screen” você quer dizer o quê?

a) Apertando Shift-PrintScreen (para a tela completa) ou Alt-PrintScreen (para a janela ativa), quero jogar o conteúdo da tela para o clipboard.

  • Nesse caso, o Windows já faz isso por você :).
    b) Usando algum comando, quero pegar a tela (ou a janela ativa, vamos lá) e quero gravá-la em um arquivo .png
    c) Algo mais complicado que você está pensando agora

Pensei em algum comando, mas acho q seria milagre neste caso rsrs

Enfim, ainda to tentando tirar o print screen em C++, tentei o codigo abaixo…o arquivo de imagem em si é criado, mas ao tentar abri-lo é mostrada a mensagem de que o visualizador de fotos não conseguiu exbir a imagem porque o arquivo está vazio :frowning:

[code]//capture
RECT ActWndRect;
char buf[100];
char buf1[20];
int xSrc=0;
int ySrc=-19;
int DepWidth=10;
int DepHeight=5;
//OutputDebugString(“Start capture act window”);
HDC ActWndDC = GetDC(hWndActWnd);

				MemDC = CreateCompatibleDC(ActWndDC);

				GetWindowRect(hWndActWnd, &ActWndRect);

				sprintf(buf,"x1 = %d , y1 = %d, x2 = %d y2 =%d", ActWndRect.left, ActWndRect.top, ActWndRect.right, ActWndRect.bottom);

				//wsprintf(buf,L"x1 = %d , y1 = %d, x2 = %d y2 =%d", ActWndRect.left, ActWndRect.top, ActWndRect.right, ActWndRect.bottom);
				OutputDebugString(buf);

				int Width = ActWndRect.right - ActWndRect.left;
				int Height = ActWndRect.bottom - ActWndRect.top;

				if (GetWindowText(hWndActWnd, buf1, 20) > 0) {
					OutputDebugString(buf1);
				}

				if (CaptureControl) {
					ySrc = DepWidth = DepHeight = 0;
				}

				HBITMAP hBitmap = CreateCompatibleBitmap(DlgDC, Width - DepWidth, Height - DepHeight);
				SelectObject(MemDC, hBitmap);

				BitBlt(MemDC, 0, 0, Width, Height, ActWndDC, xSrc, ySrc, SRCCOPY);
				SaveBitmap(MemDC, hBitmap, "imagem.bmp");

[/code]

Me ajudem, por favor…

Obrigada!

http://msdn.microsoft.com/en-us/library/windows/desktop/dd145119(v=vs.85).aspx

será que era melhor eu tentar fazer essa tarefa usando C++ e Qt ?

Karina, seguinte. Coloca um breakpoint no seu código e veja se o bitmap foi preenchido. Sem depurar seu código você poderá estar usando o framework mais simples do planeta que não chegará em lugar algum.

Dependendo do sistema você vai notar que as apis são diferentes.

Olha aqui:

Na documentação do qt tem um exemplo todo funcional

http://doc.qt.digia.com/stable/desktop-screenshot.html

Finalmente, consegui tirar o print da tela inteira \o/

Mas como nem tudo é perfeito, tenho mais um problema: se a aplicação estiver em full screen o print não é tirado ao clicar no botão da aplicação. Agora se a aplicação estiver numa resolução que não ocupe a tela toda aí sim o print é tirado corretamente…entenderam?

Alguma dica do que eu poderia estar fazendo para corrigir este bug?

Obrigada!

Pois é, quando a aplicação está em full-screen, pode ser que você não consiga obter os bits da tela via GDI, que é que você usou .
Como é que sua aplicação foi para tela cheia? Se ela está usando DirectX então você vai ter problemas

É assim:

Tenho uma aplicação em Java, nela há o botão para restartar a própria aplicação. Tive que criar um programa em C++ para que mapeasse o local desse botão e pudesse fazer a função de restartar a aplicação no caso da JVM travar (por isso não podia ser em Java este programa). Em ambiente de produção a aplicação será usada em monitores 800x600 ocupando a tela toda, mas em ambiente de desenvolvimento pode-se usar a resolução que achar melhor.

É muito estranho não encontro explicação.

Obrigada!

Vou explicar melhor…

Eu faço assim: mudo a resolução do meu monitor e abro a aplicação, ela então ocupa a tela toda, depois dou run no VC++ para executar o meu programa…quando eu dou o clique no botão restart que é quando o print deve ser tirado está acontecendo o seguinte…o print até o tirado só que não da tela da aplicação, é tirado o print do momento que eu dou alt+tab para trocar de janela, muito estranho. Agora em outra resolução onde a aplicação não ocupe a tela inteira o print é tirado corretamente…

:frowning:

Com certeza. Não só essa tarefa, como todas as tarefas que você perguntou no GUJ até agora.

Você vai resolver no QT com menos código, com uma sintaxe mais legível, mais amigável e ainda permitindo a compilação em múltiplas plataformas, ao invés de só o Windows.

Eu achei um tutorial usando QT, vou tentar fazer, mas antes uma dúvida:

Caso eu consiga fazer, e tudo funcione direitinho, QT irá exigir a instalação de alguma coisa para funcionar em produção?

Pergunto isso por caso precise como no caso do DirectX, por exemplo, é um novo processo importante aqui para o desenvolvimento do projeto, e não seria o ideal ter q instalar algo em todas as máquinas para funcionar o que eu fizer…

Obrigada!

É mais simples que o deploy normal de uma aplicação Visual C++ pura - o VC++ requer algumas DLLs (VC Runtime) que precisam de um instalador especial para funcionarem. O Qt exige apenas que você copie mais algumas DLLs (umas duas ou três, dependendo de que recursos você vai precisar do Qt) junto com seu executável, e só.

Eu estava lendo na internet e vi que tenho que baixar o qt SDK…isso fará com que nas máquinas em produção seja necessário ter instalado esse sdk também assim como na minha máquina de desenv?

Ou serão apenas essas dll’s e como saber quais serão?

Desculpe-me o excesso de questions…

Obrigada!

http://doc.qt.digia.com/4.7-snapshot/deployment-windows.html

Olhe os nomes das DLLs requeridas no título Application Dependencies - Additional Libraries.

Este é o passo a passo que vou tentar seguir:

http://www.developer.nokia.com/Community/Wiki/Archived:Como_fazer_uma_captura_de_tela,_em_Qt

Alguém tem mais alguma sugestão?

Obrigada!