- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经搜索了一段时间,但找不到用于创建和显示窗口的 python3 ctypes 和 Win32 API 的简单示例。请在此处指向良好的链接或显示代码。
提前致谢!
最佳答案
这是一个纯粹的ctypes
基于@Tcll 答案的版本也移植到“宽”API。原始版本不能正确处理 64 位 Python(将句柄转换为 c_int)并且使用的是 ANSI API,不再推荐。它还为所有内容声明了完整的 argtypes/restype,以帮助捕获编码错误。
如您所见,使用 pywin32
更容易。反而。
在 Python 2.7 32 位、Python 3.6 64 位和 Python 3.8 32 位上测试。
#coding:utf8
from __future__ import unicode_literals
import sys
from ctypes import *
from ctypes import wintypes as w # ctypes has many pre-defined Windows types
def errcheck(result,func,args):
if result is None or result == 0:
raise WinError(get_last_error())
return result
# Missing from ctypes.wintypes...
LRESULT = c_int64
HCURSOR = c_void_p
WNDPROC = WINFUNCTYPE(LRESULT,w.HWND,w.UINT,w.WPARAM,w.LPARAM)
def MAKEINTRESOURCEW(x):
return w.LPCWSTR(x)
class WNDCLASSW(Structure):
_fields_ = [('style', w.UINT),
('lpfnWndProc', WNDPROC),
('cbClsExtra', c_int),
('cbWndExtra', c_int),
('hInstance', w.HINSTANCE),
('hIcon', w.HICON),
('hCursor', HCURSOR),
('hbrBackground', w.HBRUSH),
('lpszMenuName', w.LPCWSTR),
('lpszClassName', w.LPCWSTR)]
class PAINTSTRUCT(Structure):
_fields_ = [('hdc', w.HDC),
('fErase', w.BOOL),
('rcPaint', w.RECT),
('fRestore', w.BOOL),
('fIncUpdate', w.BOOL),
('rgbReserved', w.BYTE * 32)]
kernel32 = WinDLL('kernel32',use_last_error=True)
kernel32.GetModuleHandleW.argtypes = w.LPCWSTR,
kernel32.GetModuleHandleW.restype = w.HMODULE
kernel32.GetModuleHandleW.errcheck = errcheck
user32 = WinDLL('user32',use_last_error=True)
user32.CreateWindowExW.argtypes = w.DWORD,w.LPCWSTR,w.LPCWSTR,w.DWORD,c_int,c_int,c_int,c_int,w.HWND,w.HMENU,w.HINSTANCE,w.LPVOID
user32.CreateWindowExW.restype = w.HWND
user32.CreateWindowExW.errcheck = errcheck
user32.LoadIconW.argtypes = w.HINSTANCE,w.LPCWSTR
user32.LoadIconW.restype = w.HICON
user32.LoadIconW.errcheck = errcheck
user32.LoadCursorW.argtypes = w.HINSTANCE,w.LPCWSTR
user32.LoadCursorW.restype = HCURSOR
user32.LoadCursorW.errcheck = errcheck
user32.RegisterClassW.argtypes = POINTER(WNDCLASSW),
user32.RegisterClassW.restype = w.ATOM
user32.RegisterClassW.errcheck = errcheck
user32.ShowWindow.argtypes = w.HWND,c_int
user32.ShowWindow.restype = w.BOOL
user32.UpdateWindow.argtypes = w.HWND,
user32.UpdateWindow.restype = w.BOOL
user32.UpdateWindow.errcheck = errcheck
user32.GetMessageW.argtypes = POINTER(w.MSG),w.HWND,w.UINT,w.UINT
user32.GetMessageW.restype = w.BOOL
user32.TranslateMessage.argtypes = POINTER(w.MSG),
user32.TranslateMessage.restype = w.BOOL
user32.DispatchMessageW.argtypes = POINTER(w.MSG),
user32.DispatchMessageW.restype = LRESULT
user32.BeginPaint.argtypes = w.HWND,POINTER(PAINTSTRUCT)
user32.BeginPaint.restype = w.HDC
user32.BeginPaint.errcheck = errcheck
user32.GetClientRect.argtypes = w.HWND,POINTER(w.RECT)
user32.GetClientRect.restype = w.BOOL
user32.GetClientRect.errcheck = errcheck
user32.DrawTextW.argtypes = w.HDC,w.LPCWSTR,c_int,POINTER(w.RECT),w.UINT
user32.DrawTextW.restype = c_int
user32.EndPaint.argtypes = w.HWND,POINTER(PAINTSTRUCT)
user32.EndPaint.restype = w.BOOL
user32.PostQuitMessage.argtypes = c_int,
user32.PostQuitMessage.restype = None
user32.DefWindowProcW.argtypes = w.HWND,w.UINT,w.WPARAM,w.LPARAM
user32.DefWindowProcW.restype = LRESULT
gdi32 = WinDLL('gdi32',use_last_error=True)
gdi32.GetStockObject.argtypes = c_int,
gdi32.GetStockObject.restype = w.HGDIOBJ
CW_USEDEFAULT = -2147483648
IDI_APPLICATION = MAKEINTRESOURCEW(32512)
WS_OVERLAPPEDWINDOW = 13565952
CS_HREDRAW = 2
CS_VREDRAW = 1
IDC_ARROW = MAKEINTRESOURCEW(32512)
WHITE_BRUSH = 0
SW_SHOWNORMAL = 1
WM_PAINT = 15
WM_DESTROY = 2
DT_SINGLELINE = 32
DT_CENTER = 1
DT_VCENTER = 4
def MainWin():
# Define Window Class
wndclass = WNDCLASSW()
wndclass.style = CS_HREDRAW | CS_VREDRAW
wndclass.lpfnWndProc = WNDPROC(WndProc)
wndclass.cbClsExtra = wndclass.cbWndExtra = 0
wndclass.hInstance = kernel32.GetModuleHandleW(None)
wndclass.hIcon = user32.LoadIconW(None, IDI_APPLICATION)
wndclass.hCursor = user32.LoadCursorW(None, IDC_ARROW)
wndclass.hbrBackground = gdi32.GetStockObject(WHITE_BRUSH)
wndclass.lpszMenuName = None
wndclass.lpszClassName = 'MainWin'
# Register Window Class
user32.RegisterClassW(byref(wndclass))
# Create Window
hwnd = user32.CreateWindowExW(0,
wndclass.lpszClassName,
'Python Window',
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
None,
None,
wndclass.hInstance,
None)
# Show Window
user32.ShowWindow(hwnd,SW_SHOWNORMAL)
user32.UpdateWindow(hwnd)
# Pump Messages
msg = w.MSG()
while user32.GetMessageW(byref(msg), None, 0, 0) != 0:
user32.TranslateMessage(byref(msg))
user32.DispatchMessageW(byref(msg))
return msg.wParam
def WndProc(hwnd, message, wParam, lParam):
ps = PAINTSTRUCT()
rect = w.RECT()
if message == WM_PAINT:
hdc = user32.BeginPaint(hwnd,byref(ps))
user32.GetClientRect(hwnd,byref(rect))
user32.DrawTextW(hdc,
'Python Powered Windows 你好吗?',
-1, byref(rect),
DT_SINGLELINE|DT_CENTER|DT_VCENTER)
user32.EndPaint(hwnd,byref(ps))
return 0
elif message == WM_DESTROY:
user32.PostQuitMessage(0)
return 0
return user32.DefWindowProcW(hwnd,message,wParam,lParam)
if __name__=='__main__':
sys.exit(MainWin())
关于python-3.x - python3 ctype CreateWindowEx 简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353883/
我正在用 msvc 和 C++ 做一些测试。我正在尝试使用 ResEdit 创建对话框(可在此处获得 http://www.resedit.net/ ),当创建 .RC 文件时,我正在尝试使用相同的
我有一个父窗口和一些附加到它的子窗口。使用 SpyXX,我可以看到所有的子项都有特定的样式类,比如说 ChildWindowClass。 当我用这个特定类的名称创建窗口时,CreateWindowEx
我有一个问题。我想记录我的工具开发,所以我不想在屏幕截图上绘制日期,而是想让窗口名称带有日期和时间数据。但我得到的不是字符串,而是中文字符。 这是我要将字符串分配给 CreateWindowEx()
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在学习 NeHe gamedev 教程(同时将它们更改为面向对象),但我遇到了 CreateWindowEx 演示 (http://nehe.gamedev.net/tutorial/creati
使用 C#,我很容易获得我想要的效果: 但是,我在使用 C 中的 Win32 API 做同样的事情时遇到了麻烦。我不知道如何创建一个没有图标的窗口(根本没有),但仍然有标题、最小化按钮和关闭按钮。 我
我想制作一个按钮,当您转到“我的电脑”->“帮助”->“关于 Windows”时,它看起来就像“确定”按钮。 我正在创建一个这样的按钮: hButton = CreateWindowEx(WS_EX_
好的,所以首先概述一下我正在尝试做的事情.. 我正在尝试在主父窗口中创建 3 个子窗口,并使用 EnumChildWindow 和 EnumChildProc 来枚举它们,我想创建 3 个与父窗口高度
我试图找出为什么我的应用程序有一个小的、很少像素的边框。 我的理解是 WS_POPUP 应该解决这个问题; DWORD wndExStyle = WS_EX_OVERLAPPEDWINDOW; DWO
CreateWindowEx API 真的会发送 WM_SIZE 消息吗? 当我通过 CreateWindowEx 创建一个窗口作为全屏模式时, CreateWindowEx 发布 WM_SIZE 但
我使用 CreateWindowEx 创建我的窗口,但我只在任务栏中得到一个图标;窗口的标题栏和当我 Alt+Tab 时显示的图标都显示这种类型的虚拟图标: .我将 WNDCLASSEX 中的 hIc
我使用 CreateWindowEx 创建了一个窗口,它使用以下代码作为向导对话框; DWORD dwStyle = WS_DLGFRAME | DS_CENTER | WS_POPUP | WS_C
我知道 ES_NUMBER 的存在是为了将 CreateWindowEx 限制为仅数字输入,是否有类似的机制将其限制为仅字母数字 (a-z,0-9) 输入?或者另一种方法来做类似的事情。我知道我可以事
我想使用 winAPI 创建一个窗口: int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,
我正在尝试创建一个具有特定类类型(“VSDebugger CDataTipWnd”)的窗口,但是,当我运行 CreateWindowEx 时它失败了,并且 GetLastError 告诉我找不到该类。
我正在尝试使用 C++ 设置一个简单的窗口,但我对 CreateWindowEx 的调用返回了 NULL。我使用的大部分代码来自 example在 MSDN 网站上。我尝试过的所有方法均无效,如有任何
以下是我的部分代码。每次运行程序,SPanel的CreateWindowEx返回NULL,触发错误。谁能看出这段代码有什么问题? SPanelProc 和 MainWndProc 已经声明,并且是原型
我正在尝试使用 CreateWindowEx 生成仅消息窗口: _hWnd = CreateWindowEx( 0, NULL, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE,
以下代码在Window 7上运行,但是在Windows XP上运行时,它失败并显示Windows返回的错误消息:“系统找不到指定的文件”。 #include #include #include
我想创建一个新类,然后显示一个包含指定类的窗口。我为此编写了以下代码: namespace WindowsFormsApplication1 { public partial clas
我是一名优秀的程序员,十分优秀!