Reputation: 53
I wrote some code inside a Winform. I have one panel and one PictureBox. As can be seen in the codes below; I open an exe program called Stellerium in the panel. I painted this program, which I opened in the Panel, into the PictureBox with the print window command.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//[DllImport("user32.dll", SetLastError = true)]
//private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
//[DllImport("user32.dll", SetLastError = true)]
//private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);
//[DllImport("user32.dll", SetLastError = true)]
//private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
//IntPtr appWin1;
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", SetLastError = true)]
static extern bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool bRepaint);
public enum PrintWindowOptions : uint
{
PW_DEFAULT = 0,
PW_CLIENTONLY = 1,
PW_RENDERFULLCONTENT = 2 // Undocumented. Use, e.g., with a WebBrowser
}
[DllImport("user32.dll", SetLastError = true)]
static extern internal bool PrintWindow(IntPtr hwnd, IntPtr hDC, PrintWindowOptions nFlags);
public enum DWMWINDOWATTRIBUTE : uint
{
DWMWA_NCRENDERING_ENABLED = 1, // [get] Is non-client rendering enabled/disabled
DWMWA_NCRENDERING_POLICY, // [set] DWMNCRENDERINGPOLICY - Non-client rendering policy - Enable or disable non-client rendering
DWMWA_TRANSITIONS_FORCEDISABLED, // [set] Potentially enable/forcibly disable transitions
DWMWA_ALLOW_NCPAINT, // [set] Allow contents rendered In the non-client area To be visible On the DWM-drawn frame.
DWMWA_CAPTION_BUTTON_BOUNDS, // [get] Bounds Of the caption button area In window-relative space.
DWMWA_NONCLIENT_RTL_LAYOUT, // [set] Is non-client content RTL mirrored
DWMWA_FORCE_ICONIC_REPRESENTATION, // [set] Force this window To display iconic thumbnails.
DWMWA_FLIP3D_POLICY, // [set] Designates how Flip3D will treat the window.
DWMWA_EXTENDED_FRAME_BOUNDS, // [get] Gets the extended frame bounds rectangle In screen space
DWMWA_HAS_ICONIC_BITMAP, // [set] Indicates an available bitmap When there Is no better thumbnail representation.
DWMWA_DISALLOW_PEEK, // [set] Don't invoke Peek on the window.
DWMWA_EXCLUDED_FROM_PEEK, // [set] LivePreview exclusion information
DWMWA_CLOAK, // [set] Cloak Or uncloak the window
DWMWA_CLOAKED, // [get] Gets the cloaked state Of the window. Returns a DWMCLOACKEDREASON object
DWMWA_FREEZE_REPRESENTATION, // [set] BOOL, Force this window To freeze the thumbnail without live update
PlaceHolder1,
PlaceHolder2,
PlaceHolder3,
DWMWA_ACCENTPOLICY = 19
}
[DllImport("dwmapi.dll", SetLastError = true)]
static extern internal int DwmGetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE dwAttribute, out Rectangle pvAttribute, int cbAttribute);
private void button1_Click(object sender, EventArgs e)
{
//var psi = new ProcessStartInfo(@"notepad.exe") { WindowStyle = ProcessWindowStyle.Minimized };
//using (var p = Process.Start(psi))
//{
// System.Threading.Thread.Sleep(15000);
// foreach (Process proc in Process.GetProcessesByName("notepad.exe"))
// {
// }
// p.WaitForInputIdle();
// var handle = p.MainWindowHandle;
// if (handle != IntPtr.Zero)
// {
// SetParent(handle, panel1.Handle);
// MoveWindow(handle, 0, 0, panel1.Width, panel1.Height, true);
// }
//}
}
public static Bitmap RenderWindow(IntPtr hWnd, bool clientAreaOnly, bool tryGetFullContent = false)
{
var printOption = clientAreaOnly ? PrintWindowOptions.PW_CLIENTONLY : PrintWindowOptions.PW_DEFAULT;
printOption = tryGetFullContent ? PrintWindowOptions.PW_RENDERFULLCONTENT : printOption;
var hResult = DwmGetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_EXTENDED_FRAME_BOUNDS, out Rectangle dwmRect, Marshal.SizeOf<Rectangle>());
if (hResult < 0)
{
Marshal.ThrowExceptionForHR(hResult);
return null;
}
if (dwmRect.Width <= 0 || dwmRect.Height <= 0) return null;
var bmp = new Bitmap(dwmRect.Width, dwmRect.Height);
using (var g = Graphics.FromImage(bmp))
{
var hDC = g.GetHdc();
try
{
var success = PrintWindow(hWnd, hDC, printOption);
if (!success)
{
// Failed, see what happened
var win32Error = Marshal.GetLastWin32Error();
return null;
}
return bmp;
}
finally
{
g.ReleaseHdc(hDC);
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
using (var image = RenderWindow(this.Handle, true, false))
{
if (image is null) return;
if (WindowState == FormWindowState.Minimized) return;
var panelRect = RectangleToClient(panel1.RectangleToScreen(panel1.ClientRectangle));
pictureBox1.Image?.Dispose();
pictureBox1.Image = image.Clone(panelRect, PixelFormat.Format32bppArgb);
}
}
private void Form1_Load(object sender, EventArgs e)
{
if (Screen.AllScreens.Length == 0)
{
MessageBox.Show("Second screen not available !");
}
var psi = new ProcessStartInfo(@"C:\Program Files\Stellarium\stellarium.exe") { WindowStyle = ProcessWindowStyle.Minimized };
using (var p = Process.Start(psi))
{
System.Threading.Thread.Sleep(20000);
foreach (Process proc in Process.GetProcessesByName("stellarium"))
{
}
p.WaitForInputIdle();
//System.Threading.Thread.Sleep(20000);
var handle = p.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetParent(handle, panel1.Handle);
MoveWindow(handle, 0, 0, panel1.Width, panel1.Height, true);
}
}
}
}
}
I can run the software I made on my computer with window10 as seen in the picture below.
but on my computer with Windows 11, it cannot paint the image inside the panel to the PictureBox with printwindow, as seen below.
What could be the reason why it works on one computer and not on the other?
I need your support thanks.
Upvotes: 1
Views: 130