如何激活一个程序!!(0分)

  • 主题发起人 主题发起人 破剑式
  • 开始时间 开始时间

破剑式

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用程序激活一个已经运行的程序(最小化),让它成为当前运行的程序!
 
一个例子,仅供参考。[8D]
procedure TForm1.Button1Click(Sender: TObject);
var
h1: HWND;
begin
h1 := FindWindow('Notepad',Nil);
if h1 <> 0 then
begin
ShowWindow(h1,SW_SHOWNORMAL);
SetForegroundWindow(h1);

end;
end;
 
findwindow中的'notepad'是不是project的title ?
我执行后好象没有出现正确的结果?请再赐教!
 
我是以“记事本”这个程序为例罢了,你首先的打开“记事本”,
然后再运行这个例子。[:)] 'Notepad"是 ClassName,不是project的Title .
你可以查一查Findwindow的用法。
还有,是 'Notepad',不是 'notepad'。我忘了需不需要大小写敏感了。[:D][:D]
 
那我的应用程序的ClassName是什么呢,如何获得?
 
'notepad'是要激活的应用程序的类.你把你的应用程序贴出来看看.
 
我的应用程序很大,是一个数据库应用程序,C/S型的,
主要是想限制在客户端的同一台机上同时运行两遍我的程序
 
'Notepad'是运行的程序名称,你把它改为你的可执行文件名就行了。
 
to zilo :
肯定不行
 
procedure TForm1.Button1Click(Sender: TObject);
var
h1: HWND;
begin
h1 := findwindow('T你的要激活的应用程序名称',nil);
if h1 <> 0 then
begin
ShowWindow(h1,SW_SHOWNORMAL);
SetForegroundWindow(h1);

end;
end;
 
在PROJECT部分做修改
IF NOT findwindows(nil,你要激活的应用程序窗口标题) then
begin
Application.initialize;
Application.createform(Tmainform,mainform);
。。。。。。
Application.Run;
end;
 
原来你的意思是只允许运行程序的一个实例。刚开始你没说清楚。[:D][:D]
下面有一篇文章(转贴的),虽然麻烦点,但值得一试。[:)]
-----------------------------------------------------------------
避免二次运行
实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前 一实例
的句柄,从而可以方便地进行判断,但 Windows 95 是抢先式多任务系统,其程序的前一
实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类
名的例程存在来进行判断。下面介绍在Delphi中实现的方法。
1、对主窗口程序的改动:
在主窗口(即程序创建的第一个窗口)中interface节加入
const
CM_RESTORE = WM_USER + $1000;
{自定义的“恢复”消息}
MYAPPNAME = "My Delphi Program";
并在Form的定义的public节中加入
procedure CreateParams(var Params: TCreateParams);
override;
Procedure RestoreRequest(var message: TMessage);
message CM_RESTORE;
在implementation节中加入
{指定窗口名称}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin

inherited CreateParams(Params);
Params.WinClassName := MYAPPNAME;
end;

{处理“恢复”消息}
procedure TForm1.RestoreRequest(var message: TMessage);
begin

if IsIconic(Application.Handle) = TRUE then

Application.Restore
else

Application.BringToFront;
end;


经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般在程 序
刚开始运行的时候进行判断,所以还要对DPR文件进行修改。
2、对DPR文件的改动
在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件中常 量
CM_RESTORE和MYAPPNAME的定义必须一致
const
CM_RESTORE = WM_USER + $1000;
{自定义的“恢复”消息}
MYAPPNAME = "My Delphi Program";
//我的意见(by 独孤求败):这两个const的定义可以去掉,另外message单元也不必加入。
var
RvHandle : hWnd;

将下列语句插到程序最前部(在Application.Initialize之前)
RvHandle := FindWindow(MYAPPNAME, NIL);
if RvHandle > 0 then

begin

PostMessage(RvHandle, CM_RESTORE, 0, 0);
Exit;
end;

这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退 出,
而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行.
------------------------------------------------
ps:这问题你居然给0分?[:D]
 
这问题太难,我怀疑没人能答出来,[:)]
 
大富翁可是人才济济啊,不要怀疑大富翁。[:D][:D]
而且,你这问题有不是太难。[:)]
ps:俺也是个刚入门的菜鸟而已。见笑。[8D]
 
感谢独孤求败!![:)]
其实这问题可能是不难,我用了很多种办法,都能激活很多其他的程序,如"计算器"
"Database Desktop"等,但不知为什么,就是不能激活我的应用程序,程序其实已经获得句柄,
还是用你的办法好,虽然麻烦点儿,但实现了我的目的。适合的就是最好的[:)]
再次感谢!!
不好意思,没有分送给你,找给机会给你补上!
 
接受答案了.
 
后退
顶部