请教:融合窗体句柄的问题
现状如下:
(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
这个方法试试可不可以,我这里没你的代码,没法试验。我估计应该差不多。
[解决办法]
[解决办法]
目前先暂时disable掉B程序中的相关功能按钮,先把效果做出来。到于此时的A程序,还是要允许点击。
因为A程序主界面中共有六个子系统按钮,以运行不同的子系统并融合到A程序的pagecontrol上来。
A程序中的按钮点击后,如果没有运行,则运行,否则,切换到所对应的TabSheet
*********************************************************
[解决办法]
SendMessage form1.hWnd, WM_NCACTIVATE, true/false, 0
[解决办法]
b][/b]
[解决办法]
学习,高手不少。
[解决办法]
这是两个不同进程之间的通信,去百度找找例子吧,有的