查找另一个程序,并将其显示在最前端
来源:互联网 发布:万象网管数据库密码 编辑:程序博客网 时间:2024/05/01 02:46
之前在做一个程序只能开一次,再次打开就会提示此软件已运行。但是我发现会再次点这个程序是因为它是处于最小化,或者干脆就是处于托盘状态,才会去再次点。但是点击后知道那个程序已在运行,但是还得再找到那个程序。我就想可不可以提示运行之后就把那个程序显示出来!不过在之中间我还是发现了两个问题。
1、如果此软件没做什么事还好,用正常的FindWindow(nil,'此软件的项目标题') 就可以找到。但是如果这个软件本身就已有在接收消息,且时刻在处于系统消息,那就会出现找不到该软件的句柄;或是找到了消息也发过去了,但是该软件却没收到。我就对FindWindow这个函数进行研究了下,发现参数改变下准确率就升高了好多。我是用FindWindow('TMainForm',nil)有该软件主窗体的类进行查找,成功率就高好多,或者可以把两者结合起来TFormtdmain('TMainForm','此软件的项目标题')。我目前的成功率是100%但是没在高强度情况下进行查找,不敢说完全100%能成功。
2、第二个问题是找到该软件了,消息也收到了,怎么让该软件从最小化或是托盘中显示出来,且显示在最前端。在网上找了说什么三种方法,且三种方法还各有缺点,还得多种结合才能去掉缺点。看的好像很复杂的样子,但是我记得我好像有做过这个类似的,找了下就找到了。只要用ShowWindow(Application.Handle,SW_SHOW); Application.Restore; 这两句就可以很快解决了。
希望能给读者一点帮助。
以下是我的代码,以供参考。
//这是在工程文件 program ABTMonitor; 里进行判断
var
hMutex: THandle;
h: HWND;
Size: Integer;
CopyDataStruct: TCopyDataStruct;
begin
hMutex := CreateMutex(nil, False, 'ABRMonitorSystem');
if WaitForSingleObject(hMutex, 0) = wait_TimeOut then
begin
application.MessageBox('安贝通视频监控系统已经运行!','运行',MB_OK+MB_ICONINFORMATION);
h := FindWindow('TMainForm',PChar('安贝通视频监控系统')); { 按标题查找目标窗口 }
if h > 0 then
begin
Size := 7; { 多出的两个字节用于后面的 #0 }
CopyDataStruct.lpData := PChar('@Show' + #0); { 要发送的字符串, #0 表示 PChar 结束}
CopyDataStruct.dwData := WM_COPYDATA; { 指定消息类型 }
CopyDataStruct.cbData := Size; { 指定要发送的数据的大小 }
SendMessage(h, WM_COPYDATA, 0, Integer(@CopyDataStruct)); { 发送 }
end;
Exit;
end;
Application.Initialize;
Application.Title :='安贝通视频监控系统';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TFormshowlabel, Formshowlabel);
Application.Run;
//这是在主窗体unit MainFrm;里接收消息
procedure TMainForm.Mymessage1(var t: TWmCopyData);
var
CommrevStr: string;
begin
CommrevStr := StrPas(t.CopyDataStruct^.lpData);
if CommrevStr='@Show' then
begin
ShowWindow(Application.Handle,SW_SHOW);
Application.Restore;
exit;
end;
end;
- 查找另一个程序,并将其显示在最前端
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.
- C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)
- C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)
- 怎么用一个程序向另一个程序发送字符并让其显示出来
- 更改子窗口图标并将其显示在任务栏
- 更改窗口图标并将其显示在任务栏
- 更改窗口图标并将其显示在任务栏
- 添加 自定义的view,并显示在最前端
- Mac中启动另一个程序并将窗口置于最前面
- Mac中启动另一个程序并将窗口置于最前面
- Struts2+Hibernate3将图片保存于mysql数据库并将其显示在JSP页面
- Struts2+Hibernate3将图片保存于mysql数据库并将其显示在JSP页面
- JSOUP解析网页信息并将其数据显示在listview上
- MFC中的几种播放声音的方法
- 第一个成功的struts项目
- linux 下dmalloc安装及环境配置
- 推荐16本学习JavaScript的书籍
- ShellExecute隐式调用批处理并等待返回
- 查找另一个程序,并将其显示在最前端
- 文本编辑软件UltraEdit v16.20官方简/繁体中文版下载+注册码和破解方法
- VS2005链接问题: LNK2005错误 :error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义
- 用于STM32的gcc编译器
- 求助,Java中byte[]转String,String再转byte[] ,其结果不一样!!
- Eclipse 3.5 设置Run Last Lunched 快捷键
- delphi 文件CRC32校验
- windows sdk选择
- 开发板的ip设置