2016-02-22 3 views
0

У меня есть приложение PySide, которое нужно запустить как admin. Я использовал метод, рекомендованный this post.Окно PySide появляется под другими окнами

import os 
import sys 
import time 
from PySide.QtGui import * 
from win32com.shell import shellcon 
import win32com.shell.shell as shell 
import win32con 


def force_elevated(): 
    try: 
     if sys.argv[-1] != 'asadmin': 
      script = os.path.abspath(sys.argv[0]) 
      params = ' '.join([script] + sys.argv[1:] + ['asadmin']) 
      shell.ShellExecuteEx(nShow=win32con.SW_SHOWNORMAL, 
           fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, 
           lpVerb='runas', 
           lpFile=sys.executable, 
           lpParameters=params) 
      sys.exit() 
    except Exception as ex: 
     print ex 

class MyGui(QWidget): 
    def __init__(self): 
     super(MyGui, self).__init__() 
     self.show() 

app = QApplication(sys.argv) 
force_elevated() 
splash = QSplashScreen("logo.png") 
splash.show() 
time.sleep(2) 
gui = MyGui() 
app.exec_() 

Windows, UAC выскакивает и запрашивает у пользователя, чтобы права администратора. Если пользователь выбирает «да», новый экземпляр приложения запускается в режиме администратора. Если пользователь выбирает no, оператор try терпит неудачу, и программа продолжает работать в режиме без администратора.

Проблема заключается в том, что при запуске в режиме без администратора приложение запускается за другими окнами, поэтому легко думать, что он вообще не работает. После использования cx_freeze для создания исполняемого файла это может произойти даже тогда, когда вы активируете режим администрирования do.

Я не могу иметь окно всегда на высоте. Я пытался временно установить его как всегда сверху (чтобы перенести его на передний план), а затем отключить его, но это не работает. Я также пробовал использовать различные библиотеки и встроенные функции для поиска идентификатора процесса и указания окон, чтобы вывести его на передний план. Они либо вообще не работали, либо не работали надежно.

Есть ли у кого-нибудь надежный способ убедиться, что окно PySide появляется сверху?

ответ

0

Вы можете принести окно на фронт с gui.raise_()

+0

В Windows это будет просто выделить окно в панели задач, и на самом деле не привести его на фронт. Это ограничение с Qt. Проблема заключается не столько в том, чтобы заставить ее выйти на фронт, когда это не так, но заставлять ее начинать * сверху, как обычно это делает программное обеспечение. –