zoukankan      html  css  js  c++  java
  • C# 实现窗口"绑架" (转) 武胜

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

    [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 public 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;

    启动我们需要绑架的程序
    private void Form1_Load(object sender, EventArgs e)
    {
        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();
    }
    //控制嵌入程序的位置和尺寸
    private void ResizeControl()
    {
        SendMessage(p.MainWindowHandle, WM_COMMAND, WM_PAINT, 
    0);
        PostMessage(p.MainWindowHandle, WM_QT_PAINT, 
    00);

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

        SendMessage(p.MainWindowHandle, WM_COMMAND, WM_SIZE, 
    0);
    }

    private void Form1_SizeChanged(object sender, EventArgs e)
    {
        ResizeControl();


    需 要注意的是:ResizeControl()方法很重要,否则达不到我们预期的效果.
  • 相关阅读:
    poj 2479
    纯CSS实现小圆点和三角形图案
    HDOJ1084 What Is Your Grade?
    4星|《一世富贵》:穿越到宋朝去抢了狄青、范仲淹的风头
    世界不是平的,发达国家在本地生产越来越合算。观点宏大,证据薄弱:3星|《后全球化时代》
    饥饿疗法是目前唯一确信能够延缓衰老的办法:4星|《三联生活周刊》2018年3期
    4星|《重塑》:消费者的信息能力是一个重要的经济变量。新颖的、有见地的国人原创经济理论
    3星|《高情商谈判》:谈判中控制情绪非常重要
    中间商赚差价让世界更美好:3.5星|《中间人经济》
    3.5星|《新零售的未来》:中美两国零售业的现状的分析和未来的展望
  • 原文地址:https://www.cnblogs.com/zeroone/p/1713206.html
Copyright © 2011-2022 走看看