This commit is contained in:
themixray 2021-12-27 20:35:20 +03:00
parent 6f81da14ff
commit 759912eee4
2 changed files with 124 additions and 88 deletions

View file

@ -4,10 +4,14 @@ from datetime import datetime as _dt
from pygwin.image import save as _s from pygwin.image import save as _s
from pygwin._pg import pg as _pg from pygwin._pg import pg as _pg
import pygwin.image as _img import pygwin.image as _img
import win32job as _w32j try:
import win32api as _w32a import win32job as _w32j
import win32con as _w32c import win32api as _w32a
import win32gui as _w32g import win32con as _w32c
import win32gui as _w32g
nonwin32api = False
except:
nonwin32api = True
import requests as _req import requests as _req
import tempfile as _tf import tempfile as _tf
import threading as _t import threading as _t
@ -70,37 +74,46 @@ class _win(_surface):
try:self.tray.stop() try:self.tray.stop()
except:pass except:pass
def focus(self): def focus(self):
self.hide() if not nonwin32api:
self.show() self.hide()
_w32g.BringWindowToTop(self.hwnd) self.show()
_w32g.ShowWindow(self.hwnd, _w32c.SW_SHOWNORMAL) _w32g.BringWindowToTop(self.hwnd)
_w32g.SetForegroundWindow(self.hwnd) _w32g.ShowWindow(self.hwnd, _w32c.SW_SHOWNORMAL)
_w32g.SetForegroundWindow(self.hwnd)
def hide(self): def hide(self):
_w32g.ShowWindow(self.hwnd, _w32c.SW_HIDE) if not nonwin32api:
_w32g.ShowWindow(self.hwnd, _w32c.SW_HIDE)
def show(self): def show(self):
_w32g.ShowWindow(self.hwnd, _w32c.SW_SHOW) if not nonwin32api:
_w32g.ShowWindow(self.hwnd, _w32c.SW_SHOW)
def move(self, x, y): def move(self, x, y):
rect = _w32g.GetWindowRect(self.hwnd) if not nonwin32api:
_w32g.MoveWindow(self.hwnd, int(x), int(y), rect = self._getRect()
rect[2]-x, rect[3]-y, 0) _w32g.MoveWindow(self.hwnd, int(x), int(y),
rect[2]-x, rect[3]-y, 0)
def screenshot(self, path): def screenshot(self, path):
_s(self._orig, path) _s(self._orig, path)
return path return path
def center(self,x=_w32a.GetSystemMetrics(0)/2, def center(self,x=_pg.display.get_desktop_sizes()[0][0]/2,
y=_w32a.GetSystemMetrics(1)/2): y=_pg.display.get_desktop_sizes()[0][1]/2):
self.move(x-self.size[0]/2,y-self.size[1]/2) self.move(x-self.size[0]/2,y-self.size[1]/2)
def _getRect(self):
if not nonwin32api:
return _w32g.GetWindowRect(self.hwnd)
def denyDrag(self): def denyDrag(self):
self._isallowdrag = True if not nonwin32api:
def loop(self): self._isallowdrag = True
while self._isallowdrag: def loop(self):
pos = _m.get_position() while self._isallowdrag:
pos = [pos[i]-self.position[i] for i in range(2)] pos = _m.get_position()
if pos[0] < _w32g.GetWindowRect(self.hwnd)[2]-137: pos = [pos[i]-self.position[i] for i in range(2)]
if pos[1] < 30: if pos[0] < self._getRect()[2]-137:
_m.release('left') if pos[1] < 30:
_t.Thread(target=lambda:loop(self),daemon=1).start() _m.release('left')
_t.Thread(target=lambda:loop(self),daemon=1).start()
def allowDrag(self): def allowDrag(self):
self._isallowdrag = False if not nonwin32api:
self._isallowdrag = False
# def smartDrag(self, x): # def smartDrag(self, x):
# self.allowDrag() # self.allowDrag()
# self._issmartdrag = x # self._issmartdrag = x
@ -128,10 +141,11 @@ class _win(_surface):
# _t.Thread(target=lambda:loop(self),daemon=1).start() # _t.Thread(target=lambda:loop(self),daemon=1).start()
@property @property
def position(self): def position(self):
rect = _w32g.GetWindowRect(self.hwnd) if not nonwin32api:
x = rect[0] rect = self._getRect()
y = rect[1] x = rect[0]
return (x, y) y = rect[1]
return (x, y)
@property @property
def rawFps(self): def rawFps(self):
if self._withfps: if self._withfps:
@ -143,10 +157,12 @@ class _win(_surface):
return int(self.rawFps) return int(self.rawFps)
@property @property
def hwnd(self): def hwnd(self):
return _pg.display.get_wm_info()['window'] if not nonwin32api:
return _pg.display.get_wm_info()['window']
@property @property
def visible(self): def visible(self):
return _w32g.IsWindowVisible(self._win) if not nonwin32api:
return _w32g.IsWindowVisible(self._win)
def create(title=None, size=(0,0), icon=None, resizable=False, noframe=False): def create(title=None, size=(0,0), icon=None, resizable=False, noframe=False):
screen = _pg.display.set_mode(size) screen = _pg.display.set_mode(size)
@ -162,23 +178,24 @@ def create(title=None, size=(0,0), icon=None, resizable=False, noframe=False):
return _win(icon) return _win(icon)
def ramLimit(memory_limit): def ramLimit(memory_limit):
hjob = _w32j.CreateJobObject(None,job_name) if not nonwin32api:
if breakaway: hjob = _w32j.CreateJobObject(None,job_name)
info = _w32j.QueryInformationJobObject(hjob,_w32j.JobObjectExtendedLimitInformation) if breakaway:
if breakaway=='silent':info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK) info = _w32j.QueryInformationJobObject(hjob,_w32j.JobObjectExtendedLimitInformation)
else:info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_BREAKAWAY_OK) if breakaway=='silent':info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK)
_w32j.SetInformationJobObject(hjob,_w32j.JobObjectExtendedLimitInformation,info) else:info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_BREAKAWAY_OK)
hprocess = _w32a.GetCurrentProcess() _w32j.SetInformationJobObject(hjob,_w32j.JobObjectExtendedLimitInformation,info)
try:_w32j.AssignProcessToJobObject(hjob, hprocess);g_hjob=hjob hprocess = _w32a.GetCurrentProcess()
except _w32j.error as e: try:_w32j.AssignProcessToJobObject(hjob, hprocess);g_hjob=hjob
if e.winerror!=winerror.ERROR_ACCESS_DENIED:raise except _w32j.error as e:
elif sys.getwindowsversion()>=(6,2):raise if e.winerror!=winerror.ERROR_ACCESS_DENIED:raise
elif _w32j.IsProcessInJob(hprocess,None):raise elif sys.getwindowsversion()>=(6,2):raise
warnings.warn('The process is already in a job. Nested jobs are not supported prior to Windows 8.') elif _w32j.IsProcessInJob(hprocess,None):raise
info=_w32j.QueryInformationJobObject(g_hjob,_w32j.JobObjectExtendedLimitInformation) warnings.warn('The process is already in a job. Nested jobs are not supported prior to Windows 8.')
info['ProcessMemoryLimit']=memory_limit info=_w32j.QueryInformationJobObject(g_hjob,_w32j.JobObjectExtendedLimitInformation)
info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_PROCESS_MEMORY) info['ProcessMemoryLimit']=memory_limit
_w32j.SetInformationJobObject(g_hjob,_w32j.JobObjectExtendedLimitInformation,info) info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_PROCESS_MEMORY)
_w32j.SetInformationJobObject(g_hjob,_w32j.JobObjectExtendedLimitInformation,info)
def close(): def close():
_pg.quit() _pg.quit()

View file

@ -1,67 +1,86 @@
import win32console as w32con from pygwin._pg import pg
import win32con as w32c try:
import win32gui as w32g import win32console as w32con
import win32api as w32a import win32con as w32c
import win32gui as w32g
import win32api as w32a
nonwin32api = True
except:
nonwin32api = False
import pyautogui as pag import pyautogui as pag
class console: class console:
def __init__(self): def __init__(self):
self._hwnd = w32con.GetConsoleWindow() if not nonwin32api:
self._hwnd = w32con.GetConsoleWindow()
@property @property
def hwnd(self): def hwnd(self):
return self._hwnd if not nonwin32api:
return self._hwnd
def focus(self): def focus(self):
self.hide() if not nonwin32api:
self.show() self.hide()
w32g.BringWindowToTop(self.hwnd) self.show()
w32g.ShowWindow(self.hwnd, w32c.SW_SHOWNORMAL) w32g.BringWindowToTop(self.hwnd)
w32g.SetForegroundWindow(self.hwnd) w32g.ShowWindow(self.hwnd, w32c.SW_SHOWNORMAL)
def unfocus(self): w32g.SetForegroundWindow(self.hwnd)
pass
def hide(self): def hide(self):
w32g.ShowWindow(self.hwnd, w32c.SW_HIDE) if not nonwin32api:
w32g.ShowWindow(self.hwnd, w32c.SW_HIDE)
def show(self): def show(self):
w32g.ShowWindow(self.hwnd, w32c.SW_SHOW) if not nonwin32api:
w32g.ShowWindow(self.hwnd, w32c.SW_SHOW)
def move(self, x, y): def move(self, x, y):
w32g.SetWindowPos(self.hwnd, x, y, self.size[0], self.size[1]) if not nonwin32api:
w32g.SetWindowPos(self.hwnd, x, y, self.size[0], self.size[1])
def resize(self, width, height): def resize(self, width, height):
w32g.SetWindowPos(self.hwnd, self.position[0], self.position[1], width, height) if not nonwin32api:
w32g.SetWindowPos(self.hwnd, self.position[0], self.position[1], width, height)
def minimize(self): def minimize(self):
w32g.ShowWindow(hwnd, w32c.SW_MINIMIZE) if not nonwin32api:
return self.size w32g.ShowWindow(hwnd, w32c.SW_MINIMIZE)
return self.size
def maximize(self): def maximize(self):
w32g.ShowWindow(hwnd, w32c.SW_MAXIMIZE) if not nonwin32api:
return self.size w32g.ShowWindow(hwnd, w32c.SW_MAXIMIZE)
return self.size
def title(): def title():
def fget(self): def fget(self):
return w32con.GetConsoleTitle() if not nonwin32api:
return w32con.GetConsoleTitle()
def fset(self, value): def fset(self, value):
w32con.SetConsoleTitle(str(value)) if not nonwin32api:
w32con.SetConsoleTitle(str(value))
def fdel(self): def fdel(self):
pass pass
return locals() return locals()
title = property(**title()) title = property(**title())
def center(self,x=w32a.GetSystemMetrics(0)/2, def center(self,x=_pg.display.get_desktop_sizes()[0][0]/2,
y=w32a.GetSystemMetrics(1)/2): y=_pg.display.get_desktop_sizes()[0][1]/2):
self.move(x-self.size[0]/2,y-self.size[1]/2) if not nonwin32api:
self.move(x-self.size[0]/2,y-self.size[1]/2)
@property @property
def visible(self): def visible(self):
return w32g.IsWindowVisible(self.hwnd) if not nonwin32api:
return w32g.IsWindowVisible(self.hwnd)
@property @property
def position(self): def position(self):
rect = w32g.GetWindowRect(self.hwnd) if not nonwin32api:
x = rect[0]+7 rect = w32g.GetWindowRect(self.hwnd)
y = rect[1] x = rect[0]+7
return (x, y) y = rect[1]
return (x, y)
@property @property
def size(self): def size(self):
rect = w32g.GetWindowRect(self.hwnd) if not nonwin32api:
w = rect[2] - self.position[0]-7 rect = w32g.GetWindowRect(self.hwnd)
h = rect[3] - self.position[1]-7 w = rect[2] - self.position[0]-7
return (w, h) h = rect[3] - self.position[1]-7
return (w, h)
def screenshot(self, path): def screenshot(self, path):
rect = self.position+self.size if not nonwin32api:
self.focus() rect = self.position+self.size
pag.screenshot(path, region=rect) self.focus()
return path pag.screenshot(path, region=rect)
return path
console = console() console = console()