• [C#] 主窗口嵌入子窗口(绑架窗口)


    来源:http://kb.cnblogs.com/a/1572530/

         所谓绑架就是把其他Win32程序的窗体嵌入到我们托管的WinForm中.网上已经用很多java版和 Delphi版还有WPF的.我在这里补充C#版的.
      C# 实现窗口"绑架" 所谓"绑架"就是把其他Win32程序的窗体嵌入到我们托管的WinForm中.网上已经用很多java版和Delphi版还有WPF的.我在这里补充 C#版的.
    定义需要的Win32 API.

         需要注意的是:ResizeControl()方法很重要,否则达不到我们预期的效果.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Diagnostics;


     namespace WindowsFormsApplication3
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

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

    [DllImport(
    "user32.dll")]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

    [DllImport(
    "user32.dll", SetLastError = true)]
    private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    [DllImport(
    "user32.dll", EntryPoint = "SetWindowPos")]
    private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    [DllImport(
    "user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    [DllImport(
    "user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint newLong);

    [DllImport(
    "user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);

    [DllImport(
    "user32.dll", CharSet = CharSet.Auto)]
    private static extern bool ShowWindow(IntPtr hWnd, short State);


    private const int HWND_TOP = 0x0;
    private const int WM_COMMAND = 0x0112;
    private const int WM_QT_PAINT = 0xC2DC;
    private const int WM_PAINT = 0x000F;
    private const int WM_SIZE = 0x0005;
    private const int SWP_FRAMECHANGED = 0x0020;
    public enum ShowWindowStyles : short
    {
    SW_HIDE
    = 0,
    SW_SHOWNORMAL
    = 1,
    SW_NORMAL
    = 1,
    SW_SHOWMINIMIZED
    = 2,
    SW_SHOWMAXIMIZED
    = 3,
    SW_MAXIMIZE
    = 3,
    SW_SHOWNOACTIVATE
    = 4,
    SW_SHOW
    = 5,
    SW_MINIMIZE
    = 6,
    SW_SHOWMINNOACTIVE
    = 7,
    SW_SHOWNA
    = 8,
    SW_RESTORE
    = 9,
    SW_SHOWDEFAULT
    = 10,
    SW_FORCEMINIMIZE
    = 11,
    SW_MAX
    = 11
    }


    private void Form1_Load(object sender, EventArgs e)
    {
    Process p
    = new Process();
    // 需要启动的程序
    p.StartInfo.FileName = @"C:\Windows\System32\notepad.exe";
    // 为了美观,启动的时候最小化程序
    p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    // 启动
    p.Start();

    // 这里必须等待,否则启动程序的句柄还没有创建,不能控制程序
    Thread.Sleep(1000);
    // 最大化启动的程序
    ShowWindow(p.MainWindowHandle, (short)ShowWindowStyles.SW_MAXIMIZE);
    // 设置被绑架程序的父窗口
    SetParent(p.MainWindowHandle, this.Handle);
    // 改变尺寸
    ResizeControl(p);
    }

    // 控制嵌入程序的位置和尺寸
    private void ResizeControl(Process p)
    {
    SendMessage(p.MainWindowHandle, WM_COMMAND, WM_PAINT,
    0);
    PostMessage(p.MainWindowHandle, WM_QT_PAINT,
    0, 0);

    SetWindowPos(
    p.MainWindowHandle,
    HWND_TOP,
    0, // 设置偏移量,把原来窗口的菜单遮住
    0,
    (
    int)this.Width,
    (
    int)this.Height,
    SWP_FRAMECHANGED);

    SendMessage(p.MainWindowHandle, WM_COMMAND, WM_SIZE,
    0);
    }
    }
    }
  • 相关阅读:
    沁恒 CH559 芯片入门指南
    雕刻机制作 PCB 指南
    我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制
    我的 FPGA 学习历程(01)—— FPGA 基础知识和 Quartus 的安装
    我的 FPGA 学习历程(13)—— 电子钟项目
    我的 FPGA 学习历程(12)—— 电子钟项目准备
    我的 FPGA 学习历程(11)—— 实验:按键消抖
    我的 FPGA 学习历程(10)—— 实验:数码管驱动
    我的 FPGA 学习历程(09)—— 时序逻辑入门
    我的 FPGA 学习历程(08)—— 实验:点亮单个数码管
  • 原文地址:https://www.cnblogs.com/hcbin/p/1711118.html
Copyright © 2020-2023  润新知