Hola:
muchas veces cuando hago diseño o programación me apoyo en otros archivos o videos, el tema es que me gusta tener maximizada la aplicación principal que esté usando y me molesta tener que andar cambiando entre aplicaciones o usar alt tab, etc, así que pongo los visores o reproductores ontop, no todos traen esa función(notepad por ejemplo) y aunque la traigan hay que configurarla cada vez que quiero cambiar esa modalidad. Hay muchos programas de terceros,pero ¿cuál es el chiste?así que programé con python y pyqt5 un visor de procesos y la posibilidad de ponerlos ontop, es más que obvio que no se puede con todos los procesos, pero es simple y cumple su función.
Además usé otras bibliotecas y el uso de apis para que los más nuevos vean como puede hacerse.
Son dos códigos:1) El archivo .ui que es el entorno y 2)el archivo.pyw
código del ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>frmprincipal</class>
<widget class="QDialog" name="frmprincipal">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>447</width>
<height>307</height>
</rect>
</property>
<property name="windowTitle">
<string>Procesos</string>
</property>
<widget class="QPushButton" name="btntop">
<property name="geometry">
<rect>
<x>360</x>
<y>30</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Arriba</string>
</property>
</widget>
<widget class="QPushButton" name="btnsalir">
<property name="geometry">
<rect>
<x>360</x>
<y>280</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Salir</string>
</property>
</widget>
<widget class="QLabel" name="lblnombre">
<property name="geometry">
<rect>
<x>20</x>
<y>10</y>
<width>161</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Nombre del proceso</string>
</property>
</widget>
<widget class="QListWidget" name="lstprocesos">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>341</width>
<height>271</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="btnactualizar">
<property name="geometry">
<rect>
<x>360</x>
<y>60</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Actualizar</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
código del pyw:
#-*- coding:utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication,QDialog,QMessageBox
from PyQt5 import uic
import psutil
from ctypes import c_void_p, windll
import win32gui
SWP_NOMOVE = 2
SWP_NOSIZE = 1
VEN_TOP = -1
VEN_NOTOP = -2
class Form(QDialog):
def __init__(self):
QDialog.__init__(self)
uic.loadUi("principal.ui",self)
self.btnactualizar.clicked.connect(self.TomarProcesos)
self.btntop.clicked.connect(self.PonerTop)
self.btnsalir.clicked.connect(self.Terminar)
def Actualizar(self):
for proc in psutil.process_iter():
try:
procesos=proc.as_dict(attrs=['name'])
except psutil.NoSuchProcess:
pass
else:
nombre= procesos["name"]
self.lstprocesos.addItem(nombre)
def TomarProcesos(self):
uno= self.lstprocesos.count()
if uno !=0 :
self.lstprocesos.clear()
self.Actualizar()
else:
self.Actualizar()
def PonerTop(self):
item=self.lstprocesos.selectedItems()
seleccionado=[]
for x in range(len(item)):
seleccionado.append(self.lstprocesos.selectedItems()[x].text())
proceso=''.join(seleccionado)
proceso=proceso[:-4]
ventana= win32gui.FindWindow(proceso,None)
if ventana != 0:
win32gui.SetForegroundWindow(ventana)
windll.user32.SetWindowPos(ventana, VEN_TOP, 0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE)
def closeEvent(self,event):
respuesta=QMessageBox.question(self,"Terminar","¿Desea Salir?",QMessageBox.Yes|QMessageBox.No)
if respuesta == QMessageBox.Yes: event.accept()
else: event.ignore()
def Terminar(self):
respuesta=QMessageBox.question(self,"Terminar","¿Desea Salir?",QMessageBox.Yes|QMessageBox.No)
if respuesta == QMessageBox.Yes: exit()
aplicacion=QApplication(sys.argv)
ventana=Form()
ventana.show()
aplicacion.exec_()
Saludos
Edito: Asunto modificado.
si es aporte lo mas apropiado es que el título fuera sobre lo que va (reglas del foro, los títulos deben ser descriptivos al tema )