当前位置: 首页 > news >正文

做电影网站失败了建设公司网站大概需要多少钱?

做电影网站失败了,建设公司网站大概需要多少钱?,会员制网站建设,哪种语言做的网站好WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 嵌入外部程序(本章) 第五章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现?1、定义属性2、进程嵌入(1&…

WPF Hwnd窗口互操作系列

第一章 嵌入Hwnd窗口
第二章 嵌入WinForm控件
第三章 嵌入WPF控件
第四章 嵌入外部程序(本章)
第五章 底部嵌入HwndHost


文章目录

  • WPF Hwnd窗口互操作系列
  • 前言
  • 一、如何实现?
    • 1、定义属性
    • 2、进程嵌入
      • (1)启动进程
      • (2)、进程加入作业对象
      • (3)、获取主窗口句柄
    • 3、销毁进程
  • 二、完整代码
  • 三、使用示例
    • 1、嵌入ffplay.exe
  • 总结


前言

实现嵌入各种窗口控件后,其实还会有一种需求:嵌入外部程序,我们有时可能需要嵌入一个浏览器或者或者播放器等一些已有的程序,其嵌入原理也和前面差不多,只要能获取进程的主窗口句柄,然后将窗口嵌入。


一、如何实现?

1、定义属性

定义一个依赖属性,提供给xaml设置进程运行的命令行

public class AppHost : HwndHost
{/// <summary>/// 进程运行的命令行/// </summary>public string Cmdline{get { return (string)GetValue(CmdlineProperty); }set { SetValue(CmdlineProperty, value); }}// Using a DependencyProperty as the backing store for Cmdline.  This enables animation, styling, binding, etc...public static readonly DependencyProperty CmdlineProperty =DependencyProperty.Register("Cmdline", typeof(string), typeof(AppHost), new PropertyMetadata(""));
}        

2、进程嵌入

在下列方法中进行进程嵌入,具体操作如下列步骤。

protected override HandleRef BuildWindowCore(HandleRef hwndParent)

(1)启动进程

var cmds = Cmdline.Split(" ", 2);
Process? _process;
_process.StartInfo.FileName = cmds.First();
_process.StartInfo.Arguments = cmds.Last();
_process.StartInfo.UseShellExecute = false;
_process.StartInfo.CreateNoWindow = true;
_process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
_process.Start();

(2)、进程加入作业对象

这个步骤是用于管理进程,确保《子进程跟随主进程关闭》。

static Job _job = new Job();
_job.AddProcess(_process.Handle);

(3)、获取主窗口句柄

下列提供的是简单获取主窗口句柄的方法。通过延时等待的方式获取。需要精确时间获取主窗口句柄则可以使用钩子,在子进程窗口创建事件中获取句柄。

for (int i = 0; i < 200 && _process.MainWindowHandle == 0; i++) Thread.Sleep(5);
if (_process.MainWindowHandle == 0)
{throw new Exception("process no window");
}
return new HandleRef(this, Handle);

3、销毁进程

protected override void DestroyWindowCore(HandleRef hwnd)
{_process?.Kill();_process?.Dispose();_process = null;
}

二、完整代码

其中Job对象在《子进程跟随主进程关闭》中。
AppHost.cs

using JobManagement;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using Process = System.Diagnostics.Process;
using TextBox = System.Windows.Controls.TextBox;
using Thread = System.Threading.Thread;namespace WpfHwndElement
{/// <summary>/// 需要手动dispose此控件。/// </summary>public class AppHost : HwndHost{static Job _job = new Job();Process? _process;/// <summary>/// 进程运行的命令行/// </summary>public string Cmdline{get { return (string)GetValue(CmdlineProperty); }set { SetValue(CmdlineProperty, value); }}// Using a DependencyProperty as the backing store for Cmdline.  This enables animation, styling, binding, etc...public static readonly DependencyProperty CmdlineProperty =DependencyProperty.Register("Cmdline", typeof(string), typeof(AppHost), new PropertyMetadata(""));new public IntPtr Handle{get { return (IntPtr)GetValue(HandleProperty); }private set { SetValue(HandleProperty, value); }}// Using a DependencyProperty as the backing store for Hwnd.  This enables animation, styling, binding, etc...public static readonly DependencyProperty HandleProperty =DependencyProperty.Register("Handle", typeof(IntPtr), typeof(NativeHost), new PropertyMetadata(IntPtr.Zero));protected override HandleRef BuildWindowCore(HandleRef hwndParent){try{if (DesignerProperties.GetIsInDesignMode(this)) throw new Exception("design mode won't show app");var cmds = Cmdline.Split(" ", 2);_process = new Process();_process.StartInfo.FileName = cmds.First();_process.StartInfo.Arguments = cmds.Length > 1 ? cmds.Last() : "";_process.StartInfo.UseShellExecute = false;_process.StartInfo.CreateNoWindow = true;_process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;_process.Start();_job.AddProcess(_process.Handle);for (int i = 0; i < 200 && _process.MainWindowHandle == 0; i++) Thread.Sleep(5);if (_process.MainWindowHandle == 0){throw new Exception("process no window");}Handle = _process.MainWindowHandle;var wndStyle = GetWindowLong(Handle, GWL_STYLE);wndStyle &= ~WS_THICKFRAME;wndStyle &= ~WS_CAPTION;SetWindowLong(Handle, GWL_STYLE, wndStyle | WS_CHILD);SetParent(Handle, hwndParent.Handle);}catch (Exception ex){var window = new Window() { Width = 0, Height = 0, ResizeMode = ResizeMode.NoResize, WindowStyle = WindowStyle.None, Content = new TextBox() { IsReadOnly = true, Text = ex.Message + " " + ex.StackTrace, TextWrapping = TextWrapping.Wrap } };var hwnd = new WindowInteropHelper(window).EnsureHandle();window.Show();SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_CHILD);SetParent(hwnd, hwndParent.Handle);Handle = hwnd;}return new HandleRef(this, Handle);}protected override void DestroyWindowCore(HandleRef hwnd){var window = HwndSource.FromHwnd(hwnd.Handle)?.RootVisual as Window;window?.Close();_process?.Kill();_process?.Dispose();_process = null;}const int WS_CAPTION = 0x00C00000;const int WS_THICKFRAME = 0x00040000;const int WS_CHILD = 0x40000000;const int GWL_STYLE = (-16);[DllImport("user32.dll", EntryPoint = "GetWindowLongW")]static extern int GetWindowLong(IntPtr hwnd, int nIndex);[DllImport("user32.dll", EntryPoint = "SetWindowLongW")]static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);[DllImport("user32.dll")]public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);}
}

三、使用示例

1、嵌入ffplay.exe

MainWindow.xaml

<Window x:Class="WpfHwndElement.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:WpfHwndElement"mc:Ignorable="d"Title="MainWindow" Height="360" Width="640"       ><Grid><local:AppHost Cmdline="ffplay" Width="200" Height="200"></local:AppHost></Grid>
</Window>

效果预览
在这里插入图片描述


总结

以上就是今天要讲的内容,嵌入外部程序还是相对比较容易实现的,而且也有一定的使用场景。创建进程,并能获取到进程的主窗口句柄即可。另外要注意的是管理子进程的退出,其他都问题不大。

http://www.khdw.cn/news/4383.html

相关文章:

  • centos6.6做网站全网营销整合营销
  • 成都的网站建设开发公司怎么能在百度上做推广
  • 如何做内容收费的网站成都百度推广公司电话
  • 鄂州市 网站建设建网站不花钱免费建站
  • 农业公司网站源码东营网站建设哪家更好
  • 做网站 点击跳转软文客
  • web网站开发毕业论文结论怎么做网页设计的页面
  • 微信上的网站怎么做制作网站的基本步骤
  • 做杂志的网站有哪些武汉seo搜索优化
  • 青海格尔木建设局网站如何写好软文推广
  • 网站建设设计官网阿里云免费域名
  • php个人网站论文关键词优化公司如何选择
  • 沈丘网站建设百度网站链接提交
  • 深圳网站建设公司简介宁波网站制作优化服务公司
  • avada如何做像谷歌的网站沈阳关键词推广
  • wordpress小说网站太原网站关键词推广
  • wordpress后台美化南昌seo排名外包
  • 您的网站未备案 或者原备案号被取消太原网站建设方案咨询
  • 佛山网站排名优化产品关键词的搜索渠道
  • 静态html网址网站导航源码发新闻稿平台
  • 网站建设资金投入短视频运营公司
  • 做承诺的网站个人网站网址
  • 廊坊网站建设廊坊seo运营推广
  • 商务网站开发实验百度广告大全
  • 上海网络推广南宁seo公司哪家好
  • 哪里有做杂志的免费模板下载网站个人引流推广怎么做
  • seo型网站长沙网站seo优化
  • 中国建设银行最新招聘信息网站互联网登录的网站名
  • 洞口做网站多少钱网络营销这个专业怎么样
  • 有偿做设计的网站外链是什么意思