2017-11-10 15 views
0

私たちはopenframeworksで構築されたアプリケーションを持っています。起動すると、最初にコンソールウィンドウが開き、いくつかの作業が行われ(開いたままになっている)、さらに2つの子プロセスが開始され、各プロセスがウィンドウをフルスクリーンで開きます。アプリケーションを構築している人によると、これらの2つのウィンドウタイトルを与えることは不可能です。タイトルがない場合は、ウィンドウにフォーカスを当てるにはどうすればいいですか?

私の仕事は、スクリプト作成することです:アプリがクラッシュした場合

  1. のチェックをして
  2. がウィンドウがフォアグラウンドであり、そのうちの一つに焦点が合っていることを確認してから再オープンしている場合、それらを修正します彼らはそうではありません

ちょうどこれをし、法案に合うように私の古いpythonスクリプトを再利用したいです。

from time import sleep 
import subprocess 
import psutil 
import re 
import win32gui 
import win32con 

client_path = "C:\\path_to_app.exe" 
window_name = "" 


class WindowMgr: 
    """Encapsulates some calls to the winapi for window management""" 

    def __init__(self,): 
     """Constructor""" 
     self._handle = None 

    def find_window(self, class_name, window_name=None): 
     """find a window by its class_name""" 
     self._handle = win32gui.FindWindow(class_name, window_name) 

    def _window_enum_callback(self, hwnd, wildcard): 
     '''Pass to win32gui.EnumWindows() to check all the opened windows''' 
     if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None: 
      self._handle = hwnd 

    def find_window_wildcard(self, wildcard): 
     self._handle = None 
     win32gui.EnumWindows(self._window_enum_callback, wildcard) 

    def set_foreground(self): 
     """put the window in the foreground""" 
     win32gui.SetForegroundWindow(self._handle) 

    def maximize(self): 
     win32gui.ShowWindow(self._handle, win32con.SW_MAXIMIZE) 

    def is_minimized(self): 
     return win32gui.IsIconic(self._handle) 


def client_crashed(): 
    for pid in psutil.pids(): 
     if psutil.Process(pid).name() == "app.exe": 
      return False 
    return True 


if __name__ == "__main__": 

    w = WindowMgr() 
    w.find_window_wildcard(window_name) 
    print("Checking") 
    while True: 
     if client_crashed() is True: 
      print("Reopening app.exe") 
      subprocess.Popen([client_path]) 
     else: 
      print("Not crashed") 
     if w.is_minimized: 
      print("Maximizing") 
      w.set_foreground() 
      w.maximize() 
     else: 
      print("Not minimized") 

     print("Sleeping for 10") 
     sleep(10) 

ここで、クラッシュと再起動のチェックは正常に機能します。しかし、ウィンドウにはタイトルがないので、これまでのところ最高のものは、Windows 10ムービーのようなランダムなプログラムを開くような名前のないウィンドウをチェックすることです(少なくとも、それらを奇妙なフォアグラウンドに持ち込む彼らは走ってはならないからです)。

名前を知らずにウィンドウにフォーカスを移すより良い方法はありますか?私の考えは、親プロセスを取得してそこから子供たちにアクセスし、何らかの形で焦点を当てることでしたが、私はどのように把握することができませんでした。

Pythonを使用するよりも、私が望むことを達成するためのより良い方法があれば、その方向のポインタもうれしいでしょう。あなたは独自のウィンドウクラス名を持っている場合

答えて

1

あなたは()https://msdn.microsoft.com/en-us/library/windows/desktop/ms633582(v=vs.85).aspx

getClassNameメソッドを試すか、ウィンドウのプロセスGetWindowThreadProcessId()を取得し、それはあなたのアプリケーションのインスタンスのかどうかを確認することができます。 How to get the process name in C++

+0

これはあなたがアプリケーション自体に入れるコードですか?私のスクリプトでこれと何をするのか分かりません。 –

+0

いいえ、getCalssNameが役立たない場合は、process image/exeファイルの名前を取得するために使用できるAPIのサンプルです。 –

+0

多分、この[[64ビットWindows上でプロセスを実行する]](https://stackoverflow.com/a/1632274/8918119)はPythonのやり方です。 –

関連する問題