当你爱上一个程序的功能,并且希望扩展它以满足自己的需求时,你可能会觉得困惑。毕竟,你已经为此付出了很多努力,并希望能够有效地整合这些功能。那么,是否可以将这些功能嵌套到自己的程序中呢?
首先,你可能会觉得这是不可能的,但实际上,这是完全有可能的。下面,我将为你提供一些关于如何实现这一目标的建议。
如果你具备编程技能,你可以自己编写代码来扩展该程序的功能。
你可以从了解该程序的API(应用程序接口)开始。API是一种允许不同软件应用程序相互通信的接口。通过了解API,你可以了解该程序的功能是如何实现的,并找到扩展它的方法。
这可能需要一些时间和努力,但如果你愿意投入时间和精力,这将是一个非常有价值的经验。
总之,将你喜欢的程序功能嵌套到自己的程序中是完全可能的。
文章目录
- 新建项目
- 打开外部程序
- 嵌套外部程序
- 相关依赖库
- 运行效果
接下来,我将详细讲解操作步骤。
新建项目
新建一个项目WinForm,在设计窗口中添加一个控件panel
,设置黑色背景,
以这个控件用来显示外部的桌面程序窗口,如下图
打开外部程序
在窗口加载事件中,编写一段代码,如下
var pStartInfo = new ProcessStartInfo(Path.Combine(Application.StartupPath, ResourcesName, "test_desktop.exe"), "test")
{
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
var p = Process.Start(pStartInfo);
以上是创建一个进程, 用于打开外部的程序, 例如test_desktop.exe
是一个桌面程序,
嵌套外部程序
这个进程需要进一步处理, 代码如下
//p.WaitForInputIdle();//如果报错提示无图形界面,将这个注释再试
while (p.MainWindowHandle.ToInt32() == 0)
{
Thread.Sleep(100);
}
const int WS_CAPTION = 0x00C00000;
const int WS_THICKFRAME = 0x00040000;
const int GWL_STYLE = -16;
Int32 wndStyle = GetWindowLong(p.MainWindowHandle, GWL_STYLE);
//设置无标题,不可调宽高
SetWindowLong(p.MainWindowHandle, GWL_STYLE, wndStyle & ~WS_CAPTION & ~WS_THICKFRAME);
var handle = panel1.Handle;
//设置程序父窗体里的组件为 panel1.Handle
SetParent(p.MainWindowHandle, handle);
//还可以调整窗体位置和宽高
//MoveWindow(p.MainWindowHandle, 0, 0, device.screenSize.Width, device.screenSize.Height, true);
//不要设置其它,如ProcessWindowStyle.Normal 会不显示
ShowWindowAsync(p.MainWindowHandle, (int)ProcessWindowStyle.Maximized);
注意
panel1
是控件panel
的实例,已添加到父窗体中,
如用var panel1 = new Panel()
创建的,可能会导致意料之外的问题
相关依赖库
以上有一些方法并不存在,使用前需要先导入一些系统链接库,代码如下
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
static extern bool ShowWindowAsync(IntPtr hWnd, int cCmdShow);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
运行效果
在完成上述内容编写后,若无误,便可进行编译运行。
正如我们所期望和预见的那样,将会看到原本的黑色背景区域被外部桌面程序的窗口所覆盖展示。