Merge pull request #102 from fishyboteso/feature/multi-monitor

This commit is contained in:
Adam Saudagar 2022-01-31 13:26:15 +05:30 committed by GitHub
commit e0223a0902
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 13 deletions

View File

@ -1,4 +1,10 @@
from fishy import constants
from fishy.__main__ import main
# this prevents importing from package while setup
def main():
from fishy.__main__ import main as actual_main
actual_main()
__version__ = constants.version

View File

@ -5,11 +5,11 @@ from enum import Enum
from threading import Thread
import cv2
import numpy as np
import d3dshot
import pywintypes
import win32api
import win32gui
from PIL import ImageGrab
from win32api import GetSystemMetrics
from ctypes import windll
from fishy.helper.config import config
@ -28,6 +28,8 @@ class WindowServer:
windowOffset = None
hwnd = None
status = Status.STOPPED
d3: d3dshot.D3DShot = None
monitor_top_left = None
def init():
@ -37,10 +39,19 @@ def init():
"""
try:
WindowServer.hwnd = win32gui.FindWindow(None, "Elder Scrolls Online")
monitor_id = windll.user32.MonitorFromWindow(WindowServer.hwnd, 2)
WindowServer.monitor_top_left = win32api.GetMonitorInfo(monitor_id)["Monitor"][:2]
rect = win32gui.GetWindowRect(WindowServer.hwnd)
client_rect = win32gui.GetClientRect(WindowServer.hwnd)
WindowServer.windowOffset = math.floor(((rect[2] - rect[0]) - client_rect[2]) / 2)
WindowServer.status = Status.RUNNING
d3 = d3dshot.create(capture_output="numpy")
d3.display = next((m for m in d3.displays if m.hmonitor == monitor_id), None)
WindowServer.d3 = d3
except pywintypes.error:
logging.error("Game window not found")
WindowServer.status = Status.CRASHED
@ -51,21 +62,22 @@ def loop():
Executed in the start of the main loop
finds the game window location and captures it
"""
bbox = (0, 0, GetSystemMetrics(0), GetSystemMetrics(1))
temp_screen = np.array(ImageGrab.grab(bbox=bbox))
temp_screen = WindowServer.d3.screenshot()
rect = win32gui.GetWindowRect(WindowServer.hwnd)
client_rect = win32gui.GetClientRect(WindowServer.hwnd)
fullscreen = GetSystemMetrics(1) == (rect[3] - rect[1])
titleOffset = ((rect[3] - rect[1]) - client_rect[3]) - WindowServer.windowOffset if not fullscreen else 0
fullscreen = WindowServer.d3.display.resolution[1] == (rect[3] - rect[1])
title_offset = ((rect[3] - rect[1]) - client_rect[3]) - WindowServer.windowOffset if not fullscreen else 0
crop = (
rect[0] + WindowServer.windowOffset, rect[1] + titleOffset, rect[2] - WindowServer.windowOffset,
rect[3] - WindowServer.windowOffset)
rect[0] + WindowServer.windowOffset - WindowServer.monitor_top_left[0],
rect[1] + title_offset - WindowServer.monitor_top_left[1],
rect[2] - WindowServer.windowOffset - WindowServer.monitor_top_left[0],
rect[3] - WindowServer.windowOffset - WindowServer.monitor_top_left[1]
)
WindowServer.Screen = temp_screen[crop[1]:crop[3], crop[0]:crop[2]]
WindowServer.Screen = temp_screen[crop[1]:crop[3], crop[0]:crop[2]] if not fullscreen else temp_screen
if WindowServer.Screen.size == 0:
logging.error("Don't minimize or drag game window outside the screen")

View File

@ -1,5 +1,6 @@
import logging
import typing
from logging import StreamHandler
from logging import StreamHandler, Formatter
if typing.TYPE_CHECKING:
from . import GUI
@ -11,6 +12,7 @@ class GUIStreamHandler(StreamHandler):
self.gui = gui
def emit(self, record):
self.setLevel(logging.INFO)
msg = self.format(record)
self.gui.call_in_thread(lambda: _write_to_console(self.gui, msg))

View File

@ -15,3 +15,4 @@ playsound==1.2.2
event-scheduler
pyzbar
mouse
d3dshot