Python Ctypes Win32 путь окна заголовка обрезается? - PullRequest
2 голосов
/ 22 марта 2011

Я пытался создать приложение Win32 с помощью модуля python (2.7) и ctypes.Окно создается и отображается, но заголовок окна усекается.Я получил «М» вместо «Моё тестовое окно».Что я делаю не так?

Заранее спасибо

PS Вот следующий код и скриншот:

enter image description here

# -*- coding: utf-8 -*-
from sys import platform, exit
from ctypes import *
from ctypes.wintypes import DWORD, HWND, HANDLE, LPCWSTR, WPARAM, LPARAM, RECT, POINT, MSG

WNDPROCTYPE = WINFUNCTYPE(c_int, HWND, c_uint, WPARAM, LPARAM)

WS_EX_APPWINDOW = 0x40000
WS_OVERLAPPEDWINDOW = 0xcf0000
WS_CAPTION = 0xc00000

SW_SHOWNORMAL = 1
SW_SHOW = 5

CS_HREDRAW = 2
CS_VREDRAW = 1

CW_USEDEFAULT = 0x80000000

WM_DESTROY = 2

WHITE_BRUSH = 0

class WNDCLASSEX(Structure):
    _fields_ = [("cbSize", c_uint),
                ("style", c_uint),
                ("lpfnWndProc", WNDPROCTYPE),
                ("cbClsExtra", c_int),
                ("cbWndExtra", c_int),
                ("hInstance", HANDLE),
                ("hIcon", HANDLE),
                ("hCursor", HANDLE),
                ("hBrush", HANDLE),
                ("lpszMenuName", LPCWSTR),
                ("lpszClassName", LPCWSTR),
                ("hIconSm", HANDLE)]

def PyWndProcedure(hWnd, Msg, wParam, lParam):
    if Msg == WM_DESTROY:
        windll.user32.PostQuitMessage(0)
    else:
        return windll.user32.DefWindowProcA(hWnd, Msg, wParam, lParam)
    return 0

WndProc = WNDPROCTYPE(PyWndProcedure)

hInst = windll.kernel32.GetModuleHandleW(0)
print(hInst)

wclassName = u'My Python Win32 Class'

wndClass = WNDCLASSEX()
wndClass.cbSize = sizeof(WNDCLASSEX)
wndClass.style = CS_HREDRAW | CS_VREDRAW
wndClass.lpfnWndProc = WndProc
wndClass.cbClsExtra = 0
wndClass.cbWndExtra = 0
wndClass.hInstance = hInst
wndClass.hIcon = 0
wndClass.hCursor = 0
wndClass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH)
wndClass.lpszMenuName = 0
wndClass.lpszClassName = wclassName
wndClass.hIconSm = 0
print(wndClass)

regRes = windll.user32.RegisterClassExW(byref(wndClass))
print(regRes)

wname = u'My test window'

hWnd = windll.user32.CreateWindowExW(
    0,
    wclassName,
    wname,
    WS_OVERLAPPEDWINDOW | WS_CAPTION,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    300,
    300,
    0,
    0,
    hInst,
    0)
print('hWnd', hWnd)
if not hWnd:
    print('Failed to create window')
    exit(0)

print('ShowWindow', windll.user32.ShowWindow(hWnd, SW_SHOW))
print('UpdateWindow', windll.user32.UpdateWindow(hWnd))

msg = MSG()
lpmsg = pointer(msg)

print('Entering message loop')
while windll.user32.GetMessageA(lpmsg, 0, 0, 0) != 0:
    windll.user32.TranslateMessage(lpmsg)
    windll.user32.DispatchMessageA(lpmsg)

print('done.')

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Это потому, что вы создаете окно Unicode с CreateWindowExW, но затем вызываете ANSI DefWindowProcA. Вы передаете строки Unicode, которые обычно имеют ноль для каждого другого байта, так как ваш текст находится в диапазоне ASCII, который объясняет, что вы наблюдаете.

Решение? Позвоните DefWindowProcW вместо.

На самом деле, лучшим решением было бы использовать win32gui вместо этого, чтобы завершить это немного больше для вас.

0 голосов
/ 22 марта 2011

Если вы предоставляете обычную строку, а не строку Юникода, текст отображается правильно.

wname = 'My test window'

Это выглядит странно, потому что вы используетеUnicode API (CreateWindowExW).Может быть, причина в другом.

Надеюсь, это поможет

...