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);
    }
    }
    }
  • 相关阅读:
    MyBatis环境配置
    log4j配置不同的类多个日志文件
    Http协议头、代理
    Apache二级域名实现
    Flash Builder 4.7 完美破解
    网页设计方面,哪些中英文字体的组合能有好的视觉效果
    网页设计中最常用的字体
    sublime text 3 插件:package control
    大量实用工具类、开源包,该帖绝对值得你收藏!
    10个简化Web开发者工作的HTML5开发工具
  • 原文地址:https://www.cnblogs.com/hcbin/p/1711118.html
Copyright © 2011-2022 走看看