Ayuda con capturar ventana con C++/CLI
Publicado por Allan (18 intervenciones) el 25/02/2020 22:13:50
Hola comunidad, tengo un problema el cual llevo bastante tiempo sin saber como hacerlo, o sin poder lograrlo, viendo de todo en internet, buscando información y leyendo un poco, pero resulta que no consigo hacer una captura de pantalla o lo que sea que hace esto.
Yo tengo un proceso que ejecuto desde mi programa, el proceso es un programa de un tercero, entonces yo quiero capturar la imagen de ese proceso como lo hace OBS Studio con todo y audio, he visto muchas cosas sobre lo que trae Windows.h pero no he logrado conseguirlo incluso he visto sobre Windows.MediaCapture pero parece que solo captura la ventana propia de la aplicación que lo ejecuta.
He visto como lo hace también jsmpeg-vnc, pero yo sigo sin lograrlo porque quiero hacer como un servicio de streaming, pero si no logro capturar la imagen ni audio no podré lograrlo
Esperando su ayuda gracias, aquí les dejo algo de lo que he avanzado en C++/CLI, porque me ayuda a controlar mejor procesos.
Yo tengo un proceso que ejecuto desde mi programa, el proceso es un programa de un tercero, entonces yo quiero capturar la imagen de ese proceso como lo hace OBS Studio con todo y audio, he visto muchas cosas sobre lo que trae Windows.h pero no he logrado conseguirlo incluso he visto sobre Windows.MediaCapture pero parece que solo captura la ventana propia de la aplicación que lo ejecuta.
He visto como lo hace también jsmpeg-vnc, pero yo sigo sin lograrlo porque quiero hacer como un servicio de streaming, pero si no logro capturar la imagen ni audio no podré lograrlo
Esperando su ayuda gracias, aquí les dejo algo de lo que he avanzado en C++/CLI, porque me ayuda a controlar mejor procesos.
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
#ifndef MANEJOPROCESOS_H
#define MANEJOPROCESOS_H
#include "Estructuras.h"
#include "ManejoDirectorios.h"
using namespace System;
using namespace System::Diagnostics;
using namespace System::ComponentModel;
using namespace System::Drawing;
[DllImport("user32.dll")]
static bool GetClientRect(IntPtr^ hWnd, Rectangle^ lpRect);
ref class ManejoProcesos
{
private:
List<Servidores^>^ listaServidores;
Servidores^ structServidor;
array<Process^>^ listaProcesosBuscados;
Process^ process;
Process^ proServidor;
ProcessStartInfo^ psi;
String^ msgError;
String^ servidor;
// Ejemplo parametros servidor "-b 2000 -s 640x480 -f 30 -p 9006 \"Proyecto_Arduinio_I Game Preview Standalone(64 - bit / PCD3D_SM5)\""
String^ parametrosServidor;
int servidores = 0;
// Esto sirve para que mientras se ejecuta el proceso no vaya a buscar un proceso que todavía no existe
int dormir = 7000;
public:
ManejoProcesos()
{
listaServidores = gcnew List<Servidores^>;
servidor = ManejoDirectorios::rutaPrograma + "/jsmpeg-vnc-v0.2/jsmpeg-vnc.exe ";
parametrosServidor = "-b 2000 -s 640x480 -f 30 -p 9006 ";
}
inline String^ obtenerError() { return msgError; }
bool lanzarEjecutableConServidor(String^ nombreRuta, int indiceLista)
{
try
{
process = gcnew Process();
psi = gcnew ProcessStartInfo(nombreRuta);
process->StartInfo = psi;
process->Start();
// Se detiene un rato el proceso en lo que el proceso de render inicia
System::Threading::Thread::Sleep(dormir);
//*************** Lanzar servidor
this->iniciarServidor(indiceLista, process, psi);
//*******************************
msgError = "";
return true;
}
catch (Exception ^ ex)
{
msgError = ex->Message;
return false;
}
}
// Inicia un servidor y lo almacena para luego ser terminado cuando se desea
bool iniciarServidor(int indiceLista, Process^ procesoRender, ProcessStartInfo^ infoRender)
{
try
{
proServidor = gcnew Process();
String^ rutaServidor = servidor;
psi = gcnew ProcessStartInfo(rutaServidor);
psi->Arguments = parametrosServidor + "\"" + procesoRender->ProcessName + "\"";
structServidor = gcnew Servidores();
proServidor->StartInfo = psi;
proServidor->Start();
structServidor->estadoProceso = EN_STREAMING;
structServidor->procesoServidor = proServidor;
structServidor->procesoRender = procesoRender;
structServidor->indiceLista = indiceLista;
structServidor->indice = servidores;
structServidor->infoRender = infoRender;
structServidor->infoServidor = psi;
listaServidores->Add(structServidor);
msgError = "";
servidores++;
return true;
}
catch (Exception ^ ex)
{
msgError = ex->Message;
return false;
}
}
bool detenerServidor(int indiceLista)
{
for each (Servidores ^ server in listaServidores)
{
if (server->indiceLista == indiceLista)
{
try
{
server->estadoProceso = APAGADO;
server->procesoServidor->Kill();
server->procesoRender->Kill();
listaServidores->Remove(server);
msgError = "";
return true;
}
catch (Exception ^ ex)
{
msgError = ex->Message;
return false;
}
}
}
msgError = "Servidor no encontrado...";
return false;
}
};
#endif // MANEJOPROCESOS_H
Valora esta pregunta


0