Diskuze: Nacteni pixelu pouze s aktivniho okna
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tady máš kompletní kód:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = Text;
}
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("User32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
Bitmap CaptureWindow(string caption)
{
try
{
IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, caption);
if (IntPtr.Zero == hWnd) throw new Exception("Neexistující titulek okna!");
Bitmap bmp = new Bitmap(this.Width, this.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
if (!PrintWindow(hWnd, g.GetHdc(), 0)) throw new Exception("Nepodařilo se získat obraz okna!");
g.ReleaseHdc();
}
return bmp;
}
catch (Exception ex)
{
throw ex;
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
Bitmap bmp = CaptureWindow(textBox1.Text); // v textboxu je uveden název okna
pictureBox1.Image = bmp;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
Omlouvám se kopíroval jsem části kódu a nedoplnil jsem všechno:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = Text;
}
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("User32.dll", SetLastError = true)]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);
Bitmap CaptureWindow(string caption)
{
try
{
IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, caption);
if (IntPtr.Zero == hWnd) throw new Exception("Neexistující titulek okna!");
Rectangle rect = new Rectangle();
if (!GetWindowRect(hWnd, ref rect)) throw new Exception("Nepodařilo se získat rozměry okna!");
Bitmap bmp = new Bitmap(rect.Width - rect.Left, rect.Height - rect.Top);
using (Graphics g = Graphics.FromImage(bmp))
{
if (!PrintWindow(hWnd, g.GetHdc(), 0)) throw new Exception("Nepodařilo se získat obraz okna!");
g.ReleaseHdc();
}
return bmp;
}
catch (Exception ex)
{
throw ex;
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
Bitmap bmp = CaptureWindow(textBox1.Text);
pictureBox1.Image = bmp;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
edit:
ono by bylo asi rozumnější Rectangle nahradit strukturou více
odpovídající RECT:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct Rect
{
[MarshalAs(UnmanagedType.I4)]
public int left;
[MarshalAs(UnmanagedType.I4)]
public int top;
[MarshalAs(UnmanagedType.I4)]
public int right;
[MarshalAs(UnmanagedType.I4)]
public int bottom;
public int Width()
{
return right - left;
}
public int Height()
{
return bottom - top;
}
};
definovat:
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out Rect lpRect);
a obrázek pak vytvářet:
Rect rect;
if (!GetWindowRect(hWnd, out rect)) throw new Exception("Nepodařilo se získat rozměry okna!");
Bitmap bmp = new Bitmap(rect.Width(), rect.Height());
jo a mimochodem výš uvedený kód nebude fungovat na okna s hardwarově urychlenou grafikou (DirectX apd.) Taky se to dá řešit, ale je to složitější
Zobrazeno 5 zpráv z 5.