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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#的winform窗体中如何嵌套exe应用程序相关的知识,希望对你有一定的参考价值。

参考技术A 你可以把第一个窗体Form1
传给第二个窗体
在第二个窗体中就可以操作Form1
这样循环
调用
就可以了其实也没什么啊
你在窗体Form2的属性
事件中找
closing
这个事件
在这个事件里写
form1.show();其中form1是Form1传给Form2的一个对象因为我现在在网吧
没有环境
不便给你代码
思想就是这样的
参考技术B 在界面的设计里点开属性,在窗口样式栏,有两项:
IsMdiContainer,MainMenuStrip
设置下就可以了
参考技术C (1)

用窗体的静态方法作为显示窗体和使用窗体功能的入口
一个窗体往往会显示其他窗体以实现一定的功能。通过在被调用窗体中实现一个静态函数供调用窗体使用可以简化窗体间的交互,隐蔽被调用窗体的数据,从而加强封装特性。
如主窗体为FormMain,被调用窗体为FormChild。在FormChild中实现一个静态方法:
Static
void
DoSomething()


new
FormChild.ShowDialog();
//实现功能
//…

在主窗体中调用被调用窗体的DoSomething()方法:
FormChind.DoSomething();
这样就可以显示被调用窗体并由被调用窗体执行预设的功能,并且该静态函数封装了构造和初始化被调用窗体的逻辑。程序的结构更加清晰,类的职责更加明确。
(2)

判断用户在对话框中点击的按钮
对话框的ShowDialog方法会返回DialogResult类型的返回值。DialogResult是枚举类型,通过检查该枚举值,即可知道用户是通过单击哪个按钮关闭对话框的。
例如,要检测用户是否是单击了OK按钮从而关闭文件对话框,可以使用如下代码:
if
(this.openFileDialogPhoto.ShowDialog()==DialogResult.OK)




(3)

将数据库中读取的照片文件显示在控件中
从数据库中读取照片,照片的列row.phptoImage是byte
数组类型。要将照片直接显示在控件中,而非先存储在硬盘上再调入控件显示,需要使用MemoryStream类。具体方法如下:
MemoryStream
mstream;

if(row.photoImage.Length!=0)



mstream=new
MemoryStream(row.photoImage);

this.picPhoto.Image=
new
Bitmap(mstream);


(4)

使用
Command
对象的
ExecuteScalar
方法
一般使用
Command
对象的
ExecuteReader
方法来将数据库的返回结果保存在
DataReader
中。如以下代码所示:
dbReader
=
cmd.ExecuteReader();
但如果返回结果是单个标量值,如一个整数或一个字符串,则可以执行
Command
对象的
ExecuteScalar
方法直接获取该值。
编码示例如下:
byte
b;
b
=
(byte)cmd.ExecuteScalar();
(5)


Command
对象添加参数的两种方法
这两种方法其实是
Parameters
对象的
Add
方法的两种变体。第一种方法比较简单,就是直接使用
Add
方法添加参数,并同时指定参数的类型和值。代码如下:
cmd.Parameters.Add("@EmpID",System.Data.SqlDbType.Int).Value
=
iEmpID;
另外一种方法比较复杂,它需要先声明一个
SqlParameter
类型的对象,然后使用
Add
方法添加该参数对象。这种方法便于调试。代码如下:
SqlParameter
paramEmpID
=
new
SqlParameter("@EmpID",
System.Data.SqlDbType.Int);
paramEmpID.Value
=
strSelfIntro;
cmd.Parameters.Add(paramEmpID);
(6)

解决Typed
DataSet中空字段值的问题
Typed
DataSet可以大大提高开发的效率。但是在某个字段值为空的情况下,使用Typed
DataSet读取该字段会引发系统异常。要解决这个问题有两种方法:
1)

在数据库中为所有运行为空的字段设置缺省值
2)

修改VS.NET自动生成的XSD文件
在这里仅介绍第二种方法。对于值可以为空的字段,XSD文件中原来的描述应该类似如下代码(其中DeptName、Title和Telephone字段在数据库中可以为空值):
<xs:elementname="Name"type="xs:string"/>
<xs:elementname="LoginName"type="xs:string"/>
<xs:elementname="Email"type="xs:string"/>
<xs:elementname="DeptName"type="xs:string"minOccurs="0"/>
<xs:elementname="Title"type="xs:string"minOccurs="0"/>
<xs:elementname="Telephone"
文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007921/72800.html

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#的winform窗体中如何嵌套exe应用程序的主要内容,如果未能解决你的问题,请参考以下文章

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

C# winform 程序,在用SaveFileDialog选择完路径后,主界面如何置顶?

c# winform程序,我定义一个类,一个窗体,如何在类中访问一个窗体的控件。

c# wpf代码怎么嵌入EXE应用程序?

c# windows 窗体 如何 设置菜单的权限

c#开发winform程序,如何做等待窗体?等待窗体上面只有个一gif图片和文字,读取完成后等待窗体关闭。