Bildschirm über Python script ausschalten

#1
Hallo Community!

wie es sich gehört arbeite ich mit Dualscreens ;) was auch super geil ist und äußerst komfortabel allerdings nur solange man nicht Zocken will oder Filme schauen möchte da nervt der zweite Bildschrim doch die Lösung des problems ist es den nicht benutzen Bildschirm auszuschalten .... da ich aber ein fauler Mensch bin wollte ich das ganze Automatisch über ein Script und der Windows API machen das Sieht so aus :

DisplayOffdefines.py
Code:
from ctypes import *

HWND_BROADCAST  =  0xFFFFFFFF
WM_SYSCOMMAND   =  0x01120000
SC_MonitorPOWER    =  0xF1700000


LPARAM             =  c_ulong
WPARAM             =  c_ulong
Msg             =  c_uint
HWND            =  c_void_p 
  

HWND  = HWND_BROADCAST
Msg = WM_SYSCOMMAND
WPARAM = SC_MonitorPOWER
LPARAM = 2
DisplayOff.py
Code:
import ctypes
import DisplayOffdefines

SendMsg = ctypes.CDLL("USER32")

SendMsg.SendMessage(HWND, Msg, WPARAM, LPARAM)
Wenn ich nun aber das Script ausführe wird mir gesagt:

AttributeError: function `SendMessage` not found

Woran liegt das ? ich bin noch sehr unerfahren in Python und besonders im umgang mit der Windows API aber laut API gibt es doch die funktion SendMessage in der User32.dll warum kann er sie nicht finden ? Außerdem bin ich mir nicht sicher ob ich die Datentypen auch den richtigen c_types zugeordent habe ?

Danke für eure Hilfe
 

CDW

Moderator
Mitarbeiter
#2
Die User32 ist keine CDLL ;).
HWND ist kein void pointer, sondern stumpf ein Handle.
SendMessage gibt es nicht wirklich - nur SendMessageA und SendMessageW.
Und ctypes bietet sowas nettes wie "wintypes", so dass man sich weniger Gedanken bei der Typauswahl machen muss ;)

Code:
from ctypes import *
HWND_BROADCAST = 0xFFFF
WM_SYSCOMMAND = 0x0112
SC_MonitorPOWER = 0xF170
HWND = wintypes.HWND(HWND_BROADCAST)
Msg = wintypes.UINT(WM_SYSCOMMAND)
WPARAM = wintypes.WPARAM(SC_MonitorPOWER)
LPARAM = wintypes.LPARAM(2)
windll.user32.SendMessageW(HWND, Msg, WPARAM, LPARAM)
Wobei wohl eher beide Monitore ausgemacht werden. Eventuell ist (zumindest bei Win7) die Tastenkombination "Win" + "P" auch eine Lösung.
 
#3
Hallo,

danke für deine Antwort CDW, wieder einmal was dazugelernt ... gibt es denn eine möglichkeit gezielt einen Bildschrim anzusteuern ? Müsste das nicht über den HWD Parameter gehen ? Wenn ja welcher Wert müsste da übergeben werden ? Finde darüber nichts
 
Oben