当前位置: 代码迷 >> PB >> 怎么将已经运行的某个的程序显示出来
  详细解决方案

怎么将已经运行的某个的程序显示出来

热度:62   发布时间:2016-04-29 09:08:55.0
如何将已经运行的某个的程序显示出来
最近在做一套系统,有个需求不知道如何实现?有个单独的exe程序和目前正在开发的系统需要配合起来运行,下面是需求:
如何在现有的PB代码中启动这个exe程序,如果exe程序已经启动那么如何将它显示出来.
我说的这个exe程序每次点击后都能够运行一次,我希望能够控制它只运行一次,即exe运行起来后不允许运行第二次.同时这个exe程序可以最小化,最小化后就在任务栏中隐藏了程序.

启动exe到好解决用run和shellexcute可以办到,但是如何控制它只允许运行一次?另外如果程序已经运行了如何显示这个exe主界面(可能这个exe的主界面不在桌面的最前面,显示主界面就是将她的窗口显示在最前面).

谢谢!急等答案.

------解决方案--------------------
FUNCTION ulong FindWindowA(ulong classname,string windowname) LIBRARY "User32.dll" alias for "FindWindowA;Ansi" 
FindWindowA 找窗口 参数classname窗口的类型 windowname窗口的title 填你exe的title。

如果返回0 就是没开。你做打开。否则返回窗口句柄,就是ShellExecuteA(ulong hwnd,ref string lpOperation,ref string lpFile,ref string lpParameters,ref string lpDirectory,ulong nShowCmd) 参数hwnd的值。

都返回句柄了。。跳过打开过程不就不会开第二次了么。

如果你那个EXE最小化到任务栏了,FindWindowA能不能找到得你自己试试了。

------解决方案--------------------
以下是一個判斷計算器程式是否打開並放置最前.

ls_winname = '小算盤'
//查找計算其是否已經打開
lul_hwnd = FindWindow(ls_clsname,ls_winname)
IF lul_hwnd = 0 THEN
//打開計算器
Run("calc")
ELSE
//將計算器窗體置為頂層
ShowWindow(lul_hwnd,9)
BringWindowToTop(lul_hwnd)
END IF
------解决方案--------------------
如果你的exe程序是自己用PB编辑的,用以下代码,最好在application里操作,否则AppName需固定exe名称

FUNCTION UInt GetModuleFileNameA(ULong hModule,REF String lpFileName,ULong nSize) LIBRARY "kernel32.dll"

ULong ll_mutex
ULong ll_err
String ls_mutex_name
String ls_buffer = Space(255)

IF Handle(GetApplication()) <> 0 THEN
getmodulefilenamea(Handle(GetApplication()),ls_buffer,255)

IF Handle(GetApplication(),FALSE) <> 0 THEN
ls_mutex_name = AppName + Char(0)//AppName为你exe的名称,在application里有效
ll_mutex = createmutexa(0,0,ls_mutex_name)
ll_err = getlasterror()
IF ll_err = 183 THEN
MessageBox(ls_AppName,"程序已经运行了,请不要重复运行!")
HALT CLOSE
END IF
END IF

END IF

------解决方案--------------------
少了两个外部函数

FUNCTION ULong createmutexa (ULong lpmutexattributes,Integer binitialowner,REF String lpname) LIBRARY "kernel32.dll" ALIAS FOR "CreateMutexA"
FUNCTION ULong getlasterror () LIBRARY "kernel32.dll" ALIAS FOR "GetLastError"
------解决方案--------------------
顶!需要调用DLL
------解决方案--------------------
sendmessage