zoukankan      html  css  js  c++  java
  • [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);
    }
    }
    }
  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/hcbin/p/1711118.html
Copyright © 2011-2022 走看看