Einen angenehmen Heiligen Abend, liebe Leute.
Es geht um ein Screenshot-Programm, das andere Fenster ausliest, auch wenn sie aus dem Screen-Bereich herausgeschoben wurden.
Wenn ich das Firefox-Bibliothek-Fenster kopieren will, wird nur beim ersten Aufruf das aktuelle Fenster angezeigt.
Wird der Inhalt des Firefox-Bibliothek-Fensters manipuliert (z.B. durch Löschen der Chronik), wird beim nächsten Aufruf das ursprüngliche Fenster angezeigt.
Erst nach Schließen und wieder Öffnen des Firefox-Bibliothek-Fensters wird der neue Inhalt angezeigt.
Bei anderen Fenster funktioniert das richtig.
Hat jemand eine Idee, woran das liegen könnte?
Ich hänge mal den minimalistischen Code an.
Der Name des Fensters wird in der
Form-Code
Designer-Code
Es geht um ein Screenshot-Programm, das andere Fenster ausliest, auch wenn sie aus dem Screen-Bereich herausgeschoben wurden.
Wenn ich das Firefox-Bibliothek-Fenster kopieren will, wird nur beim ersten Aufruf das aktuelle Fenster angezeigt.
Wird der Inhalt des Firefox-Bibliothek-Fensters manipuliert (z.B. durch Löschen der Chronik), wird beim nächsten Aufruf das ursprüngliche Fenster angezeigt.
Erst nach Schließen und wieder Öffnen des Firefox-Bibliothek-Fensters wird der neue Inhalt angezeigt.
Bei anderen Fenster funktioniert das richtig.
Hat jemand eine Idee, woran das liegen könnte?
Ich hänge mal den minimalistischen Code an.
Der Name des Fensters wird in der
BtnCopy_Click(..)
eingetragen.
C#-Quellcode
- using System;
- using System.Drawing;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
- namespace ScreenShotOtherProgram
- {
- public partial class DlgScreenShot : Form
- {
- #region Win32
- private class Win32
- {
- internal const int SrcCopy = 0xCC0020;
- internal const int SwShowNormal = 1;
- internal struct RECT
- {
- internal int left;
- internal int top;
- internal int right;
- internal int bottom;
- internal int Width { get { return this.right - this.left; } }
- internal int Height { get { return this.bottom - this.top; } }
- internal int Area { get { return this.Width * this.Height; } }
- }
- [DllImport("user32.dll", SetLastError = true)]
- internal static extern bool BringWindowToTop(IntPtr hWnd);
- [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
- internal static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
- [DllImport("user32")]
- internal static extern bool ShowWindow(IntPtr hWnd, int style);
- [DllImport("user32.dll")]
- internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
- [DllImport("user32.dll")]
- internal static extern IntPtr GetDC(IntPtr hwnd);
- [DllImport("gdi32.dll", SetLastError = true)]
- internal static extern IntPtr CreateCompatibleDC(IntPtr hRefDC);
- [DllImport("gdi32.dll")]
- internal static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
- [DllImport("Gdi32.dll")]
- internal static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);
- [DllImport("gdi32.dll")]
- internal static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
- [DllImport("gdi32.dll")]
- internal static extern bool DeleteDC(IntPtr hdc);
- [DllImport("user32.dll")]
- internal static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
- [DllImport("gdi32.dll")]
- internal static extern bool DeleteObject(IntPtr hObject);
- }
- #endregion Win32
- public DlgScreenShot()
- {
- this.InitializeComponent();
- }
- private void BtnCopy_Click(object sender, EventArgs e)
- {
- // separates Firefox-Download-Fenster
- string txt = "Bibliothek";
- //txt = "Info.txt - Editor";
- this.ScreenShot(txt);
- }
- /// <summary>
- /// Screenshot des benannten Fensters aufnehmen und anzeigen
- /// </summary>
- /// <param name="txt"></param>
- private void ScreenShot(string txt)
- {
- IntPtr hWnd = Win32.FindWindow(null, txt);
- if (hWnd == IntPtr.Zero)
- {
- MessageBox.Show($"Window not found:\n\n\"{txt}\"", "No Window Match", MessageBoxButtons.OK, MessageBoxIcon.Information);
- return;
- }
- // Capture app to Bitmap
- Bitmap bmp = CreateBitmap(hWnd);
- if (bmp is null)
- {
- MessageBox.Show("Capture failed!", "Capture Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- return;
- }
- if (this.pictureBox1.Image != null)
- {
- this.pictureBox1.Image.Dispose();
- }
- // save bitmap to a public folder
- this.pictureBox1.Image = bmp;
- }
- /// <summary>
- /// Auslesen des Capture der Form
- /// </summary>
- /// <param name="hWnd">die Ziel-Form</param>
- /// <returns>deren Capture</returns>
- private static Bitmap CreateBitmap(IntPtr hWnd)
- {
- // minimiertes / maximiertes Fenster normal anzeigen
- Win32.ShowWindow(hWnd, Win32.SwShowNormal);
- // und nach vorn holen
- Win32.BringWindowToTop(hWnd);
- System.Threading.Thread.Sleep(100);
- Win32.RECT rect = default;
- Win32.GetWindowRect(hWnd, ref rect);
- if (rect.Area == 0)
- {
- // Fenster ohne Fläche
- return null;
- }
- Bitmap bmp = new Bitmap(rect.Width, rect.Height);
- IntPtr hdcFrom = Win32.GetDC(hWnd);
- IntPtr hdcTo = Win32.CreateCompatibleDC(hdcFrom);
- IntPtr hBitmap = Win32.CreateCompatibleBitmap(hdcFrom, bmp.Width, bmp.Height);
- if (hBitmap != IntPtr.Zero)
- {
- IntPtr hLocalBitmap = Win32.SelectObject(hdcTo, hBitmap);
- Win32.BitBlt(hdcTo, 0, 0, bmp.Width, bmp.Height, hdcFrom, 0, 0, Win32.SrcCopy);
- Win32.SelectObject(hdcTo, hLocalBitmap);
- Win32.DeleteDC(hdcTo);
- Win32.ReleaseDC(hWnd, hdcFrom);
- bmp = Image.FromHbitmap(hBitmap);
- Win32.DeleteObject(hBitmap);
- }
- return bmp;
- }
- }
- }
C#-Quellcode
- namespace ScreenShotOtherProgram
- {
- partial class DlgScreenShot
- {
- /// <summary>
- /// Required designer variable.
- /// </summary>
- private System.ComponentModel.IContainer components = null;
- /// <summary>
- /// Clean up any resources being used.
- /// </summary>
- /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (components != null)
- {
- components.Dispose();
- }
- }
- base.Dispose(disposing);
- }
- #region Windows Form Designer generated code
- /// <summary>
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- /// </summary>
- private void InitializeComponent()
- {
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.btnCopy = new System.Windows.Forms.Button();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.SuspendLayout();
- //
- // pictureBox1
- //
- this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.pictureBox1.Location = new System.Drawing.Point(94, 13);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(694, 425);
- this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.pictureBox1.TabIndex = 0;
- this.pictureBox1.TabStop = false;
- //
- // btnCopy
- //
- this.btnCopy.Location = new System.Drawing.Point(13, 13);
- this.btnCopy.Name = "btnCopy";
- this.btnCopy.Size = new System.Drawing.Size(75, 23);
- this.btnCopy.TabIndex = 1;
- this.btnCopy.Text = "Copy";
- this.btnCopy.UseVisualStyleBackColor = true;
- this.btnCopy.Click += new System.EventHandler(this.BtnCopy_Click);
- //
- // DlgScreenShot
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(800, 450);
- this.Controls.Add(this.btnCopy);
- this.Controls.Add(this.pictureBox1);
- this.Name = "DlgScreenShot";
- this.Text = "DlgScreenShot";
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.ResumeLayout(false);
- }
- #endregion
- private System.Windows.Forms.PictureBox pictureBox1;
- private System.Windows.Forms.Button btnCopy;
- }
- }
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!