首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问:融合窗体句柄的有关问题

2013-01-01 
请教:融合窗体句柄的问题现状如下:(1).A.exe是主程序,上面有一个button1,点击后,运行子系统B.exe,并融合到

请教:融合窗体句柄的问题
现状如下:

(1).    A.exe  是主程序,上面有一个button1,点击后,运行子系统B.exe,并融合到A.exe的pageControl(或panel)上来。
    通过 windows.SetParent来实现B.exe融合到A.exe中来的。

(2).   B.exe中有一个按钮,点击代码如下:
        form1:=Tform1.create(self);
        form1.showmodal;
        form1.release;

运行后,B能正常融合,点击B中的按钮,表单form1也能正常工作,包括TAB等都能正常工作。

但是:无意中切换到已打开的EXCEL或其他任务栏中的程序,再回来时,发现刚打开的form1不见了,
      于是用ALT+TAB 进行切换,找到了刚找开的form1,原来跑到A.exe(最大化)后面去了。

于是:修改B.exe中按钮的代码:
      form1:=Tform1.create(self);
      form1.ParentWindow:=application.MainForm.Handle; //加了这句
        form1.showmodal;
        form1.release;

再运行,并点击任务栏下的其他内容,再回到A.exe中来,form1还在(这次没有“消失”),但是form1窗体标题始终不能成激活状态,即使用鼠标点击窗体标题,也不能成激活状态。后发现,点击B.exe按钮,form1出现时,窗体就不能成激活状态。

后来又用了 setActiveWindow、SetForcegroundWindow、PostMessage等想将form1设置成激活状态,一直不行。

后来又用SPY想强行激活,也不行。

所以,请教各位高手,我哪一个环节出现问题了。网上也找了DLL融合的方法进行参考,没有能解决。

[解决办法]
你这个是应用程序句柄的问题,你两个exe运行,相当于在两个进程空间中,
你这种做法不好控制的,有个解决方案不知道是否适合你,你可以尝试把B改成带窗体的动态库,然后,把A的application句柄传入B.dll,控制起来就很自如了。

[解决办法]
同意楼上的,将application传进去。公用一个。
还有form1:=Tform1.create(self); 这个也改为application创建
[解决办法]
你在B.exe中那个按钮单击的时候别创建form1,而是直接发消息给A.exe,
然后在A.exe中写一个消息处理函数,如果收到消息,立即给B.exe发消息,把LParam设置成A的Application.handle,然后在B.exe中添加一个消息处理函数,
收到A的消息之后,把LParam转换成Application,取个名字App_A之后
  form1:=Tform1.create(App_A);
  form1.ParentWindow:=App_A.MainForm.Handle; //加了这句
  form1.showmodal;
  form1.release
这个方法试试可不可以,我这里没你的代码,没法试验。我估计应该差不多。
[解决办法]

引用:
目前暂时在B.exe中用findwindow返回A.exe的MainForm的句柄,来作为Form1的父一级句柄

Delphi(Pascal) code
Var 
  H:HWND;
begin
  H:=FindWindow('A的标题',nil);
  if H>0 then
  begin
    form1:=Tform1.create(App_A);
    win……

showmodal是在同一线程里搞的吧。
[解决办法]
showmodel本身是接管了主程序的消息队列来实现showmodel的效果的,你的b程序本身和a程序根本就是两个进程,b的showmodel没办法接管其他进程的消息队列的
我身边没环境,你试下这样看看
在a程序点击运行时先createprocess运行b.exe,然后waiteforsingleobject等待b运行结束,然后b再showmodel,此时a是阻塞状态,不会响应鼠标事件的
[解决办法]
引用:
showmodel本身是接管了主程序的消息队列来实现showmodel的效果的,你的b程序本身和a程序根本就是两个进程,b的showmodel没办法接管其他进程的消息队列的
我身边没环境,你试下这样看看
在a程序点击运行时先createprocess运行b.exe,然后waiteforsingleobject等待b运行结束,然后b再showmodel,此时a是阻塞状态,不会响应鼠标事件的

这样,岂不是 一运行B,A里就不能操作了,直到b结束。我估计不是lz想要的吧~ 估计楼主是想 showmodel 时 A不能操作;不showmodel时,A可以操作
[解决办法]
那问题有点麻烦,需要重载a的wndproc a.exe运行b.exe后一旦bshowmodel就发送一个消息给a,此时a丢弃掉所有键盘消息和鼠标消息,当b的模式窗体关闭后再给a发送消息,此时a再响应所有消息
[解决办法]
就怕 b不给改吧~~ 不然写一起得了啊


[解决办法]
目前先暂时disable掉B程序中的相关功能按钮,先把效果做出来。到于此时的A程序,还是要允许点击。

因为A程序主界面中共有六个子系统按钮,以运行不同的子系统并融合到A程序的pagecontrol上来。

A程序中的按钮点击后,如果没有运行,则运行,否则,切换到所对应的TabSheet


*********************************************************
[解决办法]
SendMessage form1.hWnd, WM_NCACTIVATE, true/false, 0
[解决办法]
请问:融合窗体句柄的有关问题请问:融合窗体句柄的有关问题b][/b]
[解决办法]
学习,高手不少。
[解决办法]
这是两个不同进程之间的通信,去百度找找例子吧,有的

热点排行