读书人

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

发布时间: 2012-02-27 10:00:22 作者: rapoo

如何将已经运行的某个的程序显示出来
最近在做一套系统,有个需求不知道如何实现?有个单独的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

读书人网 >PB

热点推荐