代码片段_C#将exe运行程序嵌入到自己的winform窗体中

C#将exe运行程序嵌入到自己的winform窗体中

Posted 2020-06-21 快乐家++ (Alan)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#将exe运行程序嵌入到自己的winform窗体中相关的知识,希望对你有一定的参考价值。

以下例子是将Word打开,然后将它嵌入到winform窗体中,效果如下图:
C将exe运行程序嵌入到自己的winform窗体中 - kingmax_res - iSport
注意:该方法只适用于com的exe(如word,Excel之类),.net的编的exe就不能用这用方法嵌入到窗体中。

技术分享

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WindowsTest
{

public partial class Form2 : Form
{
    Process process = null;
    IntPtr appWin;
    private string exeName = "";
    \[DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
        CharSet = CharSet.Unicode, ExactSpelling = true,
        CallingConvention = CallingConvention.StdCall)\]
    private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);
    \[DllImport("user32.dll", SetLastError = true)\]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    \[DllImport("user32.dll", SetLastError = true)\]
    private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    \[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)\]
    private static extern long GetWindowLong(IntPtr hwnd, int nIndex);

    \[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)\]
    private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
    //private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
    \[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);
    \[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)\]
    private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
    private const int SWP_NOOWNERZORDER = 0x200;
    private const int SWP_NOREDRAW = 0x8;
    private const int SWP_NOZORDER = 0x4;
    private const int SWP_SHOWWINDOW = 0x0040;
    private const int WS\_EX\_MDICHILD = 0x40;
    private const int SWP_FRAMECHANGED = 0x20;
    private const int SWP_NOACTIVATE = 0x10;
    private const int SWP_ASYNCWINDOWPOS = 0x4000;
    private const int SWP_NOMOVE = 0x2;
    private const int SWP_NOSIZE = 0x1;
    private const int GWL_STYLE = (-16);
    private const int WS_VISIBLE = 0x10000000;
    private const int WM_CLOSE = 0x10;
    private const int WS_CHILD = 0x40000000;
    public string ExeName
    {
        get
        {
            return exeName;
        }
        set
        {
            exeName = value;
        }
    }

    public Form2()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.exeName = @"D:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.exe";
        try
        {
            // Start the process 
            process = System.Diagnostics.Process.Start(this.exeName);
            // Wait for process to be created and enter idle condition 
            process.WaitForInputIdle();
            // Get the main handle
            appWin = process.MainWindowHandle;
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, "Error");
        }
        // Put it into this form
        SetParent(appWin, this.Handle);
        // Remove border and whatnot
        // SetWindowLong(appWin, GWL\_STYLE, WS\_VISIBLE);
        // Move the window to overlay it on this window
        MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
    }
    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        try
        {
            process.Kill();
        }
        catch { }
    }
    private void Form2_Resize(object sender, EventArgs e)
    {
        if (this.appWin != IntPtr.Zero)
        {
            MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
        }
        //base.OnResize(e);
    }
}

}

以上是关于C#将exe运行程序嵌入到自己的winform窗体中的主要内容,如果未能解决你的问题,请参考以下文章

winForm窗体嵌入U3d

小5聊C# Winform窗体,程序点击运行第二次自动判断显示,解决不重复打开两个相同窗体

c#的winform窗体中如何嵌套exe应用程序

C# Winform WPF DeskBand 窗体嵌入任务栏,在任务栏显示文字

C# WINFORM 怎么内嵌外部的exe程序

C# 自己写的Winform程序批量导入Excel文件到Oracle数据库的过程中,程序运行会很慢!而且Winform窗体会卡


原网址: 访问
创建于: 2023-05-30 14:51:48
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论