# pip install pywin32
import win32api
import win32con
# 현재 모니터 주사율 변경하기
def set_refresh_rate(refresh_rate: int) -> None:
dm = win32api.EnumDisplaySettings(None, 1)
dm.DisplayFrequency = refresh_rate # type: ignore
iRet = win32api.ChangeDisplaySettings(dm, 0) # type: ignore
if iRet != win32con.DISP_CHANGE_SUCCESSFUL:
print("Failed to change the refresh rate")
# 현재 모니터 주사율 가져오기
def get_refresh_rate() -> int:
dm = win32api.EnumDisplaySettings(None, win32con.ENUM_CURRENT_SETTINGS)
return dm.DisplayFrequency
if __name__ == "__main__":
set_refresh_rate(240)
print(get_refresh_rate())
set_refresh_rate(120)
print(get_refresh_rate())
파이썬으로 게임 런쳐를 만들고 있는데 게임 실행시에만 주사율을 바꿔야 하는 경우가 생겼습니다. 인터넷에 쳐봤는데 파이썬으로 모니터 주사율을 가져오거나 바꾸는 예제가 없더라구요.. 그래서 직접 작성했습니다.
윈도우에서 직접 해상도를 바꾸는거라 OS에 접근 하기 위해 어쩔 수 없이 win32 api를 활용했습니다. 이 때문에 당연하지만 해당 코드는 윈도우에서만 작동합니다. pywin32 라는 패키지를 사용하면 윈도우 api를 파이썬에서 간단하게 사용할 수 있는것으로 보입니다. 내부적으로는 EnumDisplaySettings 와 ChangeDisplaySettings를 사용합니다.
set_refresh_rate(원하는 주사율) 함수를 이용해 현재 모니터의 주사율을 설정할 수 있고, get_refresh_rate() 함수를 이용해 현재 모니터의 주사율을 얻어올 수 있습니다.
만약에 리눅스나 Mac OS에서 작동시키고 싶다면 해당 윈도우 API에 대응되는 시스템 콜을 잘 찾아봐서 코드를 바꾸면 될 거 같습니다.
일단 위 코드는 제 컴퓨터 환경 윈도우 10, 버전 21H2 에서 잘 작동합니다.
코드를 쓰면서 문뜩 현대 프로그래머 중에 윈도우 API를 제대로 아는 프로그래머가 몇이나 될 지 생각이 들었습니다.
저도 리버싱 할때만 대충 인터넷에 찾아서 보지 윈도우 API에 대해 제대로 깊게 공부해본적이 없거든요.. 언젠가 하긴 해야 되는데 아직 PE구조도 제대로 공부 안해서 언제 공부할 지 미지수네요 ㅎㅎ; 제가 MFC로 코딩하던 시절에 태어났으면 몰라도 C#이 나오고 나서 이걸로만 코딩하다보니 직접 윈도우 API를 호출 할 일이 거의 없네요.
컴파일러가 알아서 제 코드를 윈도우 API 호출 코드로 바꿔주다보니..
'프로그래밍 > Python' 카테고리의 다른 글
[Python] m4a 음원 파일에 앨범 아트 추가하기 (0) | 2023.12.12 |
---|---|
[Python] 동영상 파일의 책갈피(Chapter, 챕터) 데이터 읽어오기 - 자막 싱크 조절 (0) | 2023.11.11 |
[번역] 파이썬에서 멀티 프로세싱(Multiprocessing) VS 멀티 쓰레딩(Threading) VS 비동기(AsyncIO) 비교 (0) | 2023.06.03 |
네이버 웹툰 다운로더 v5.3-NEW (Naver_Webtoon_Downloader) / 초고속 다운로드 지원 (113) | 2023.05.30 |
[Selenium] Edge 업데이트 이후 IEDriver 제대로 작동하지 않을때 - 익스플로러 Edge로 강제 리다이렉트 문제 (0) | 2023.03.23 |