2
我看到有win32process.GetWindowThreadProcess()
获取窗口处理程序并返回它的进程ID。有没有办法做相反的事情:通过它的进程ID获取正在运行的进程的窗口处理程序?像win32gui.GetWindowHandler(processId)
?从启动进程获取窗口处理程序
具体是什么,我试图做的事:
我有一个运行外部程序Python脚本,让说的notepad.exe。
当调用runProgram()
方法时,记事本被触发。我想防止此方法多次运行记事本。我做到这一点以如下方式,使用win32process:
import win32process as process
import sys
PORTABLE_APPLICATION_LOCATION = "C:\\Windows\\system32\\notepad.exe"
processHandler = -1
def runProgram():
global processHandler
#don't run a process more than once
if (isLiveProcess(processHandler)):
#Bring focus back to running window!
return;
try:
startObj = process.STARTUPINFO()
myProcessTuple = process.CreateProcess(PORTABLE_APPLICATION_LOCATION,None,None,None,8,8,None,None,startObj)
processHandler = myProcessTuple[2]
except:
print(sys.exc_info[0])
def isLiveProcess(processHandler): #Process handler is dwProcessId
processList = process.EnumProcesses()
for aProcess in processList:
if (aProcess == processHandler):
return True
return False
runProgram()
可正常工作,但如果该进程被发现是已经活着,我希望把它的窗口后到前与win32gui
是的,我看到在我的研究这个选项。这是有问题的,因为应用程序的标题可能会有所不同:例如,打开文件可能会将记事本的标题从“Notepad.exe”更改为“fileName.txt”。我正在考虑用processId而不是标题来实现这一点,只是想,也许有更直接的东西。 – user1555863
干杯,与此编辑完全是如何完成的。有一点值得注意:我的测试结果显示'win32gui.ShowWindow(hwnd,1)'比'SetForegroundWindow(hwnd)'有更好的效果,似乎效果更好。 – user1555863