我想给一个程序做一个外挂,基本的功能就是我的程序A启动其他的程序B,程序A始终依附在程序B的边框上.
就有点像以前winamp播放器的那种外挂.
程序B移动的时候程序A也跟着移动
程序B关闭的时候程序A也跟着关闭
程序B可以向程序A文本框中写数据
在网上查了写资料,好像都要用到钩子之类的技术~~~各位高手有什么高见,分不够可以再加

解决方案 »

  1.   

    ^ō^ 不难不难! B A 有联系吗? 有则用: WM_CopyData; 无则用: API
      

  2.   

    要么用消息钩子,截获该进程的消息,并判断是不是目标窗体的移动或大小改变。
    或者写dll注入目标进程,使用SetWindowLong增加目标窗体的WndProc,然后也是截获该窗体的消息进行处理。前者实现方便些,后者效率高些。
    不过用.NET都不好办。
      

  3.   

    shinaterry :可否详解谢谢.
    lake_cx:在c++下实现也可以,能不能详细介绍一下,谢谢
      

  4.   

    再顶一下~~莫非.net就真的做不了?
    本人的C++水平真的有限啊
    期待高手啊!
      

  5.   

    .net也能做,不过还是C++比较合适
      

  6.   

    再顶一下!
    顺便问一下vs2005里的c++可以么?
    真的没在vs2005里面用过c++
      

  7.   

    在A中编写如下代码试试:
    B frm = new B();
    protected override void OnLoad(EventArgs e)
    {
    base.OnLoad(e);
    frm.Show(this);
    }
    protected override void OnLayout(LayoutEventArgs levent)
    {
    base.OnLayout(levent);
    frm.Height = this.Height;
    frm.Top = this.Top;
    frm.Left = this.Right;
    }
    protected override void OnLocationChanged(EventArgs e)
    {
    base.OnLocationChanged(e);
    frm.Height = this.Height;
    frm.Top = this.Top;
    frm.Left = this.Right;
    }
      

  8.   

    hbxtlhx :谢谢你的回复,
    现在的问题是A和B是两个独立的程序,
    B程序是以前的工程师写的,
    因为里面有很多参数要计算获得,操作上不方便
    我想在他的基础上做点操控上的扩展,
    B的源代码已经没有了
    :-(...
      

  9.   

    只要非托管的就好办
    不过貌似微软自己的dll也用了Hook,但是不知道他怎么搞的
      

  10.   

    lake_cx :如果要写钩子程序实现的话,去钩其他进程的消息是不是要用全居钩子?
    在网上看了半天似乎C#是不支持键盘鼠标以外的全局钩子的还有写全局钩子是不是要写在dll里啊?小弟第一次接触钩子程序,对mfc也不熟悉,请对指教
    谢谢
      

  11.   

    写了一大堆关于钩子的,结果网络挂了,郁闷,又给你写一遍吧其实有个WH_GETMESSAGE,不知道好不好用,给你介绍下步骤(非托管)
    1、假设你的主程序为项目A,HookDll为项目B,项目B中导出两个函数叫SetHook和UnHook(举例而已,下同)。
    2、项目A启动就CreateFileMapping、MapViewOfFile写进去一个用于接受消息的窗体(项目A中的一个Handle),然后调用HookDll的SetHook。
    3、项目B中的SetHook函数中使用SetWindowsHookEx安装钩子(你可以试试WH_GETMESSAGE的钩子),并设置一个钩子函数HookProc,HookDll中的HookProc中使用OpenFileMapping、MapViewOfFile读取项目A中的那个窗体的Hanlde(设置个全局变量让它只读一次),然后直接将消息用SendMessage转发给这个Handle(加一个自定义消息进行转发)。
    4、项目A中添加接受消息的窗体的消息映射,处理它的窗体移动、改变大小等消息(需要用FindWindow定位目标窗体的Handle,过滤掉非此窗体的消息)。
    注意:写代码时谨记,HookDll是多份映像,并非只有A进程中才有。事实上SetHook以后目标进程会装载HookDll,此时HookProc是在目标进程中执行的,因此只能通过内存文件映射等方法进行通信(进程间通信)
      

  12.   

    重金诚聘C++
    http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245
      

  13.   

    重金诚聘C++
    http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245
      

  14.   

    重金诚聘C++
    http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245
      

  15.   

    lake_cx :非常感谢你的指点.刚才听了你说的非托管的建议,找来找去找到了这个:
    http://www.codeproject.com/KB/system/globalsystemhook.aspx是一个c++和c#混合实现Global Hook的例子
    很有参考价值各位高手一起研究啊!!!
      

  16.   

    最新的进展:晚上把下载的这个hook程序修改测试了一下,增加了WH_CBT hook 结果发现只能钩住测试窗体,钩不住其他窗体
    莫非真像有写帖子上讲的vs2005编译器编译的全局钩子都不好用?期待高手一同测试~~~
      

  17.   

    调用住窗体的DLLnew 一个主窗体 AS this.ACtiveform()然后this.children.parent = new 的这个对象
    是否可行?
      

  18.   

    yilanwuyu123:我有一点没理解,现在两个窗体是独立的进程,
    我还真没考虑过能不能把另外一个进程放到自己的窗体里
    就好比我做一个框架程序,把别人的进程放到自己的框架里如果能的话也许也不矢是一个解决办法
      

  19.   

    你拿C++写那个HookDll就行了,另外再导出个函数,把你的窗体Handle传给他,CreateFileMapping、MapViewOfFile这些都放到HookDll去,主程序用C#写得了,重载窗体的WndProc函数,if (m.Msg = ...)就是你的HookDll给你发消息了你看着办好了
      

  20.   

    lake_cx :感谢知道,今天终于有了点进展,结贴!