C# uygulamamdaki bir tarayıcı bileşenini tümleştirmek için WebKit.NET kullanıyorum. Sorun, sadece tarayıcı penceresindeki görünen kısmı ekran görüntüsü ile yakalayabilmem. Tüm sayfanın ekran görüntüsünü yakalamanın bir yolu var mı? Bu mesajı kuyruğu kadar vida rağmenC# ve WebKit.NET ile tam bir web sitesi ekran görüntüsü nasıl yakalanır?
cevap
Eğer http://cutycapt.sourceforge.net/ ya da belki http://iecapt.sourceforge.net/ veya http://labs.awesomium.com/capturing-web-pages-with-c-net/ kullanabilirsiniz, bu tür olası NativeMethods.SendMessage kullanarak olduğuna görünüyor?
WebBrowser'ı kullanıyorum yerine; ScrollBarsEnabled = false
Tüm sayfayı yakalamama izin ver.
protected override void Render(HtmlTextWriter writer)
{
StringBuilder builder = new StringBuilder();
HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(builder));
base.Render(htw);
string html = builder.ToString();
_Generate(html);
}
private void _Generate(string html)
{
var browser = new WebBrowser { ScrollBarsEnabled = false };
DisplayHtml(html, browser);
browser.DocumentCompleted += WebBrowser_DocumentCompleted;
while (browser.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
browser.Dispose();
}
private void DisplayHtml(string html, WebBrowser browser)
{
browser.Navigate("about:blank");
if (browser.Document != null)
{
browser.Document.Write(string.Empty);
}
browser.DocumentText = html;
}
WebBrowser bileşenini kullanarak birkaç çözüm tökezledim, ancak onu yakalamak için WebKit motorunu kullanmakla ilgileniyorum. – topless
Bu deneyin:
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Windows.Forms;
public byte[] picbytes;
private void capture_Click(object sender, EventArgs e)
{
makepicture(txtURL.Text.Trim());
pictureBox1.Visible = true;
pictureBox1.Image = ByteToImage(picbytes);
}
private void makepicture(string url)
{
Thread thread = new Thread(delegate()
{
using (WebBrowser browser = new WebBrowser())
{
browser.ScrollBarsEnabled = false;
browser.AllowNavigation = true;
browser.Navigate(url);
browser.Width = 1024;
browser.Height = 1575;
browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
while (browser.ReadyState != WebBrowserReadyState.Complete)
{
System.Windows.Forms.Application.DoEvents();
}
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser browser = sender as WebBrowser;
using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height))
{
browser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, browser.Width, browser.Height));
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
byte[] bytes = stream.ToArray();
picbytes = bytes;
}
}
}
public static Bitmap ByteToImage(byte[] blob)
{
MemoryStream mStream = new MemoryStream();
byte[] pData = blob;
mStream.Write(pData, 0, Convert.ToInt32(pData.Length));
Bitmap bm = new Bitmap(mStream, false);
mStream.Dispose();
return bm;
}
Kodunuzu girebilir misiniz? ('Düzenle', her şeyi seçin, Ctrl-k). Teşekkürler. – byako
Bu, kusursuz bir şekilde çalışır, bir kusurla .. Tarayıcı kontrolünü ayarlamak için boyutları gerçekten bilmeniz gerekir, çünkü sadece içindekileri yazdıracaktır. Artık bir web sayfasının ne kadar geniş ve ne kadar yüksek olduğunu nasıl anladığını bulmak için bir arama olduğunu düşünüyorum. DocumentCompleted() içindeki – Switch
, tarayıcı nesnesini oluşturduktan hemen sonra aşağıdakileri ekleyin. int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width; browser.Height = height; browser.Width = width; – Switch
kodunuzu gönderebilir miyim İşte
bazı kodudur? –@EmanueleGreco Ne yazık ki değil, ama gösteri amaçlı olarak en az bir sürümünü çıkartabileceğim bir yarın bakacağım. – topless
Ben de gelecekteki planları için gerçekten uygun olan JavaScript kodu da enjekte etmek için ara katman sağlar beri awesomium çözüm ile gidecek düşünüyorum. – topless