मेरे डब्ल्यूपीएफ में, मेरे पास एक ग्रिड है जिसमें विंडोजफॉर्महोस्ट है जो एक .exe होस्ट करेगा। मेरा .xaml कोड है:

<Window x:Class="PracticeWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PracticeWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="1300">
    <Grid x:Name="grid">

        <Button x:Name="BtnRun" Content="Run" 
                HorizontalAlignment="Left" Margin="10,10,0,0"
                VerticalAlignment="Top" Click="BtnRun_Click"/>

        <WindowsFormsHost x:Name="formshost" Margin="0,39,0,0"
            Height="720" Width="1280"/>

    </Grid>
</Window>

और मेरी सीएस:

namespace PracticeWPF
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll")]
        public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        private void BtnRun_Click(object sender, EventArgs e)
        {
            Process proc = Process.Start("notepad.exe"); 
            proc.WaitForInputIdle();

            while (proc.MainWindowHandle == IntPtr.Zero)
            {
                Thread.Sleep(100);
                proc.Refresh();
            }
            SetParent(proc.MainWindowHandle, formshost.Handle);
        }    
    }
}

जब मैं WinForm का उपयोग कर रहा हूं तो सब कुछ काम करता है लेकिन जब मैं एक wpf के अंदर WindowsFormsHosting का उपयोग करता हूं तो .exe दिखाई नहीं देता है। किसी भी तरह की सहायता का स्वागत किया जाएगा। धन्यवाद।

1
Henry Smith 9 फरवरी 2021, 19:20

2 जवाब

सबसे बढ़िया उत्तर

इस लिंक पर एक और विंडो के अंदर डॉकिंग विंडो< /a> मुझे लगता है कि आपका उत्तर है। मैंने इसे आपके कोड से मिलान किया

xaml

<Window x:Class="PracticeWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"  
        xmlns:local="clr-namespace:PracticeWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="1300">
    <Grid x:Name="grid">

        <Button x:Name="BtnRun" Content="Run" 
                HorizontalAlignment="Left" Margin="10,10,0,0"
                VerticalAlignment="Top" Click="BtnRun_Click"/>

        <WindowsFormsHost x:Name="formshost" Margin="0,39,0,0"
            Height="720" Width="1280">
             <wf:Button Text="by button" Visible="False"></wf:Button>
        </WindowsFormsHost>
    </Grid>
</Window>

और mainwindow.cs

namespace PracticeWPF
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnRun_Click(object sender, EventArgs e)
        {
            //Process proc = Process.Start("notepad.exe");
           //proc.WaitForInputIdle();

            //while (proc.MainWindowHandle == IntPtr.Zero)
            //{
            //    Thread.Sleep(100);
            //    proc.Refresh();
            //}
            this.Width = formshost.Width;
            this.Height = formshost.Height;
            dockIt();
        }


        [DllImport("user32.dll")]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        private Process pDocked;
        private IntPtr hWndOriginalParent;
        private IntPtr hWndDocked;

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);


        private void dockIt()
        {
            if (hWndDocked != IntPtr.Zero) //don't do anything if there's already a window docked.
                return;
            IntPtr hWndParent = IntPtr.Zero;

            pDocked = Process.Start(@"notepad");
            while (hWndDocked == IntPtr.Zero)
            {
                pDocked.WaitForInputIdle(1000); //wait for the window to be ready for input;
                pDocked.Refresh();              //update process info
                if (pDocked.HasExited)
                {
                    return; //abort if the process finished before we got a handle.
                }
                hWndDocked = pDocked.MainWindowHandle;  //cache the window handle
            }
            //Windows API call to change the parent of the target window.
            //It returns the hWnd of the window's parent prior to this call.
            hWndOriginalParent = SetParent(hWndDocked, formshost.Handle);

            //Wire up the event to keep the window sized to match the control
            formshost.SizeChanged += new SizeChangedEventHandler(Panel1_Resize);
            //Perform an initial call to set the size.
            Panel1_Resize(new Object(), new EventArgs());
        }

        private void undockIt()
        {
            //Restores the application to it's original parent.
            SetParent(hWndDocked, hWndOriginalParent);
        }

        private void Panel1_Resize(object sender, EventArgs e)
        {
            //Change the docked windows size to match its parent's size. 
            MoveWindow(hWndDocked, 0, 0, (int)formshost.Width, (int)formshost.Height, true);
        }
    }
}
0
Meysam Asadi 9 फरवरी 2021, 21:12

मुझे डर है WindowsFormsHost का उपयोग किसी अन्य एप्लिकेशन के अंदर संपूर्ण विंडोज फॉर्म एप्लिकेशन को होस्ट करने के लिए नहीं किया जा सकता है।

इसका उपयोग डब्ल्यूपीएफ व्यू में एक व्यक्तिगत विंडोज़ फॉर्म नियंत्रण को होस्ट करने के लिए किया जाता है।

यदि आप wpf विंडो में हैंडल प्राप्त करना चाहते हैं, तो इसके साथ प्रयास करें:

new System.Windows.Interop.WindowInteropHelper(this).Handle

आप formshost.Handle के बजाय इस हैंडल का उपयोग करना चाहते हैं।

0
mm8 9 फरवरी 2021, 20:05