4

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を使用してそのウィンドウを前面に戻したいと思います。

4

1 に答える 1

4

Windows API がこの方法を提供しているとは思いませんが、開いているすべてのウィンドウを反復処理して、自分に属するウィンドウを見つけることができます。

私はあなたのプログラムを次のように修正しました:

import win32process
import win32process as process
import win32gui
import sys

PORTABLE_APPLICATION_LOCATION = "C:\\Windows\\system32\\notepad.exe"
processHandler = -1


def callback(hwnd, procid):
    if procid in  win32process.GetWindowThreadProcessId(hwnd):
        win32gui.SetForegroundWindow(hwnd)

def show_window_by_process(procid):
    win32gui.EnumWindows(callback, procid)


def runProgram():
    global processHandler
    #don't run a process more than once
    if (isLiveProcess(processHandler)):
        #Bring focus back to running window!
        show_window_by_process(processHandler)
        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()
于 2013-06-24T10:48:27.600 に答える