Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - samuelhm

#11
Me costó encontrar la manera de hacer una captura de una ventana en c#, en c++ estaba apuntado en un post con chincheta,pero en c# no encontré nada, por si alguien alguna vez busca el modo, asi es como lo he podido hacer:

MetodosNativos.CS
Código (csharp) [Seleccionar]

public static class MetodosNativos
   {
public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter
       
       [DllImport("gdi32.dll")]
       public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
           int nWidth, int nHeight, IntPtr hObjectSource,
           int nXSrc, int nYSrc, int dwRop);
       
       [DllImport("gdi32.dll")]
       public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,int nHeight);
     
       [DllImport("gdi32.dll")]
       public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
       
       [DllImport("gdi32.dll")]
       public static extern bool DeleteDC(IntPtr hDC);
       
       [DllImport("gdi32.dll")]
       public static extern bool DeleteObject(IntPtr hObject);
       
       [DllImport("gdi32.dll")]
       public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
     

       /*User32.Dll*/
       [StructLayout(LayoutKind.Sequential)]
       public struct RECT
       {
           public int left;
           public int top;
           public int right;
           public int bottom;
       }
       public enum GetWindow_Cmd : uint
       {
           GW_HWNDFIRST = 0,
           GW_HWNDLAST = 1,
           GW_HWNDNEXT = 2,
           GW_HWNDPREV = 3,
           GW_OWNER = 4,
           GW_CHILD = 5,
           GW_ENABLEDPOPUP = 6
       }
       [DllImport("user32.dll")]
       public static extern IntPtr GetDesktopWindow();
       
       [DllImport("user32.dll")]
       public static extern IntPtr GetWindowDC(IntPtr hWnd);
       
       [DllImport("user32.dll")]
       public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
       
       [DllImport("user32.dll")]
       public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
}

Capturadora.cs
Código (csharp) [Seleccionar]

<....Codigo de la clase
public static Bitmap CapturarVentana(IntPtr handle)
       {
           try
           {
               RedimensionarVentana(handle);
               // get te hDC of the target window
               IntPtr hdcSrc = MetodosNativos.GetWindowDC(handle);
               // get the size
               MetodosNativos.RECT windowRect = new MetodosNativos.RECT();
               MetodosNativos.GetWindowRect(handle, ref windowRect);
               int width = windowRect.right - windowRect.left;
               int height = windowRect.bottom - windowRect.top;
               // create a device context we can copy to
               IntPtr hdcDest = MetodosNativos.CreateCompatibleDC(hdcSrc);
               // create a bitmap we can copy it to,
               // using GetDeviceCaps to get the width/height
               IntPtr hBitmap = MetodosNativos.CreateCompatibleBitmap(hdcSrc, width, height);
               // select the bitmap object
               IntPtr hOld = MetodosNativos.SelectObject(hdcDest, hBitmap);
               // bitblt over
               MetodosNativos.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, MetodosNativos.SRCCOPY);
               // restore selection
               MetodosNativos.SelectObject(hdcDest, hOld);
               // clean up
               MetodosNativos.DeleteDC(hdcDest);
               MetodosNativos.ReleaseDC(handle, hdcSrc);
               // get a .NET image object for it
               Bitmap bmp = Bitmap.FromHbitmap(hBitmap);
               MetodosNativos.DeleteObject(hBitmap);
               return bmp;
           }
           catch (Exception err) {MessageBox.show(err.ToString()); return null; }
           
       }
....Codigo...->


El metodo retorna un Bitmap de la ventana que le digas como parametro, aunque tambien se podria hacer sin retorno y hacer bmp.save("ruta\archivo.bmo"); si lo que buscas es crear un archivo con la captura.
#13
Ups lo habia escrito mal en el foro, estaba así:

do
{
     objeto[0].image= OtraClase.GetImage();
}while (objeto[0] == null); // Bucle hasta que objeto contenga algo que no sea null;
EventoMeterObjeto(objeto[0]); /// al intentar lanzar mi evento salta un null Reference exception, imposible que sea null en teoria no?


Ahora analizandolo, objeto seguro que no es null, pues si no, no habria salido del bloque while, entoces solo queda: puede un evento ser o estar null??
#14
yo tube un problema parecido, lo solucione mas o menos así:


label1.Invoke(new Action(() =>{ label1.Text = Line; }));

cambia label por tu control, y lo que quieras modificar dentro de los corchetes de Action.
#15
Necesitas otras librerias que no vienen en el .net framework para controlar el scanner.
Supongo que para c++ habrá un monton super sencillas de implementar, en .net tienes esto que no abarca solo scanners de codigos de barras pero que puede serte util:

http://www.microsoft.com/en-us/download/details.aspx?id=5355

y esta es la documentación oficial para que puedas guiarte un poco:
http://msdn.microsoft.com/en-us/library/bb429024.aspx

Para mi msdn es muy dificil de leer, pero hay miles de sitios con documentación:

http://www.codeproject.com/Articles/34473/Controlling-a-Barcode-Reader-with-POS-for-NET


A mi hace poco me hizo falta hacer algo que no se podia en .net, asi que solo hice una dll en c++ y arreando, es otra opcion.
#16
Tengo una clase, que contiene el siguiente codigo:

do
{
     objeto.image[0] = OtraClase.GetImage();
}while (objeto[0] == null); // Bucle hasta que objeto contenga algo que no sea null;
EventoMeterObjeto(objeto[0]); /// al intentar lanzar mi evento salta un null Reference exception, imposible que sea null en teoria no?


#17
Me auto respondo, no habia ningun problema, el maldito visual studio te cambia todas las configuraciones cuando cambias de debug a release, no estaba la dirección de donde linkear las librerias.
#18
Estoy intentando crear una DLL que usa imageMagick++.
Al compilar como libreria estatica (.lib) me compila sin problema, pero cuando pongo en visual studio que me cree en DLL, me saltan 9 errores que no acabo de entender:

1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall Magick::Image::write(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?write@Image@Magick@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall Magick::Image::scale(class Magick::Geometry const &)" (__imp_?scale@Image@Magick@@QAEXABVGeometry@2@@Z)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall Magick::Image::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?read@Image@Magick@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall Magick::Image::crop(class Magick::Geometry const &)" (__imp_?crop@Image@Magick@@QAEXABVGeometry@2@@Z)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall Magick::Image::~Image(void)" (__imp_??1Image@Magick@@UAE@XZ)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Magick::Image::Image(void)" (__imp_??0Image@Magick@@QAE@XZ)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Magick::Geometry::~Geometry(void)" (__imp_??1Geometry@Magick@@QAE@XZ)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Magick::Geometry::Geometry(char const *)" (__imp_??0Geometry@Magick@@QAE@PBD@Z)
1>corta.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Magick::Geometry::Geometry(unsigned int,unsigned int,long,long,bool,bool)" (__imp_??0Geometry@Magick@@QAE@IIJJ_N0@Z)
1>c:\users\samuel\documents\visual studio 2013\Projects\SolutionPokerDLL\Release\pokerdll.dll : fatal error LNK1120: 9 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Esto se puede solucionar, o no puedo crear dll's que usen otras librerias?
#19
Programación C/C++ / Re: Capturar ventanas
19 Abril 2014, 23:45 PM
Despues de trastear toda la tarde, he encontrado una forma super sencilla de encontrar la posicion de una ventana externa a tu aplicacion:
HWND ventana = FindWindow(NULL, "Nombre de la ventana");
RECT posicion;
GetWindowRect(ventana, &posicion);


Solo hay que saber el nombre de la ventana, y no hacer falta hooking ni historias.
#20
Programación C/C++ / Capturar ventanas
19 Abril 2014, 15:52 PM
Hola chicos, tengo una duda,
No acabo de encontrar que parte de la api, me permitiria en visual c++ capturar la imagen de una ventana (externa a mi programa).

Por si no se entiende, para windows es muy sencillo capturar una imagen de ventana ( pulsando alt + imp pant.) esto pasa la imagen al portapapeles, y se puede pegar por ejemplo en el paint.

A mi me gustaria que mi programa pudiera obtener la imagen de una ventana de otro programa sin pulsar las teclas, y poder trabajas sobre la imagen.

he estado mirando los codigos de este foro, pero no logro averiguar como obtener las coordenadas de una ventana abierta ajena a mi programa.
Gracias de antemano.