使用ctypes和SetWindowLongPtr更改WinOS Windows外观

时间:2019-06-16 20:41:25

标签: python

您好,我正在尝试使用ctypes和window API更改活动窗口的样式。

import ctypes
from ctypes import *

title = "MY CUSTOM WINDOW NAME"
b_string1 = title.encode('utf-8')
Active_W = ctypes.windll.user32.GetActiveWindow()
ctypes.windll.user32.SetWindowTextA(Active_W,ctypes.c_char_p(b_string1)) #rename window not working

成功更改了活动名称。

但是

import bpy 
import ctypes
from ctypes import *

SWP_HIDEWINDOW = 0x80 #HIDE 
SWP_SHOWWINDOW = 0x40 #SHOW
SWP_NOMOVE     = 0x0002 #NO MOVE
SWP_NOSIZE     = 0x0001 #NO SIZE
SIZESW_MINIMIZE = 6
SW_RESTORE = 9
GWL_STYLE = -16
GWL_EXSTYLE = -20

title = "0x00200000L"
b_string1 = title.encode('utf-8')
Active_W = ctypes.windll.user32.GetActiveWindow()

ctypes.windll.user32.SetWindowLongPtrA(Active_W,GWL_STYLE,b_string1)
ctypes.windll.user32.SetWindowPos(Active_W,-1,2560,60,1000,1000,SWP_SHOWWINDOW|SWP_NOMOVE)

使窗口冻结?没有任何一种样式对我有用,它会保持冻结状态(例如,通过Blender进行此操作,是否可以将其链接起来?或者我做错了吗?)有时它会立即冻结,有时只有当我单击鼠标离开时才会冻结新窗口有关于SetWindowLongPtr和ctypes的示例吗?

我从倪的建议中尝试过

import ctypes
from ctypes import *


Active_W = ctypes.windll.user32.GetActiveWindow()

SWP_SHOWWINDOW = 0x40 #SHOW
SWP_NOMOVE     = 0x0002 #NO MOVE
GWL_STYLE = -16
GWL_EXSTYLE = -20

EXSTYLE = ctypes.windll.user32.GetWindowLongPtrA(Active_W,GWL_EXSTYLE)
STYLE   = ctypes.windll.user32.GetWindowLongPtrA(Active_W,GWL_STYLE)

flags = ctypes.c_long(0x00800000|STYLE)
b_string1 = ctypes.byref(flags)

ctypes.windll.user32.SetWindowLongPtrA(Active_W,GWL_STYLE,b_string1) 
ctypes.windll.user32.SetWindowPos(Active_W,-1,2560,60,1000,1000,SWP_SHOWWINDOW|SWP_NOMOVE)

它不再冻结了,但是我没有看到样式改变吗? 如果我更改EXSTYLE,则任何代码会将窗口转换为此。 exstyle change对此进行任何样式更改any style change

1 个答案:

答案 0 :(得分:0)

您传递给b_string1的参数SetWindowLongPtrA似乎是完全错误的。第三个参数应为窗口样式,类型为LONG_PTR,同时将其传递给字符串。请尝试以下操作:

flags = ctypes.c_long(0x00200000L)
b_string1 = ctypes.byref(flags)

此外,您可能应该首先使用GetWindowLongPtrA来获取当前标志,并避免覆盖所有标志。