Python-Windows SystemParametersInfoW与SystemParametersInfoA函数之间的差异

Python-Windows SystemParametersInfoW与SystemParametersInfoA函数之间的差异,windows,python-3.x,unicode,32bit-64bit,Windows,Python 3.x,Unicode,32bit 64bit,尽管我对堆栈溢出和其他方面进行了研究,但我有一个似乎无法澄清的快速问题。我的问题涉及到Windows SystemParametersInfo函数及其变体SystemParametersInfo(Unicode)和SystemParametersInfo(ANSI)与Python 3.x脚本的关系 在我正在编写的Python脚本中,我遇到了关于何时使用这些变体的两种不同解释。表示对于64位机器,必须使用SystemParametersInfoW,而对于32位机器,必须使用SystemParame

尽管我对堆栈溢出和其他方面进行了研究,但我有一个似乎无法澄清的快速问题。我的问题涉及到Windows SystemParametersInfo函数及其变体SystemParametersInfo(Unicode)和SystemParametersInfo(ANSI)与Python 3.x脚本的关系

在我正在编写的Python脚本中,我遇到了关于何时使用这些变体的两种不同解释。表示对于64位机器,必须使用SystemParametersInfoW,而对于32位机器,必须使用SystemParametersInfoA,因此应该运行函数来确定脚本在哪个位机器上运行。然而,(我看到更多的人支持这种类型的答案),并说SystemParametersInfoW必须与Python3.x一起使用,因为它传递一个Unicode字符串,而SystemParametersInfoA用于Python2.x及以下版本,因为它传递一个字节字符串,符合ANSI标准


那么,什么是正确的答案在这里,因为我需要继续与我的脚本不同的前进?同样,我使用的是Python3.5,所以第二个答案合适是有意义的,但是机器的位是否是使用SystemParametersInfoW和SystemParametersInfoA之间的一个因素?这是两种答案的混合,还是我应该继续使用SystemParametersInfoW,而不管它是在32位还是64位机器上使用?我甚至需要确定脚本运行的机器的位吗?感谢您帮助澄清此问题

在Windows 3.x/95/98/ME上,可能只有
系统参数sinfoa
工作正常。在所有其他系统上,无论操作系统比特数是多少,A和W风格都可以工作

假设您只支持“最新”版本的Windows,您应该选择最适合在您的语言中使用的风格,这通常意味着与您的语言中的默认字符串类型匹配的风格


如果希望同时支持Python v2和v3,则必须在运行时选择使用默认字符串类型时要调用的函数。

在Windows 3.x/95/98/ME上,可能只有
系统参数sinfoa
工作正常。在所有其他系统上,无论操作系统比特数是多少,A和W风格都可以工作

假设您只支持“最新”版本的Windows,您应该选择最适合在您的语言中使用的风格,这通常意味着与您的语言中的默认字符串类型匹配的风格


如果希望同时支持Python v2和v3,则必须在运行时选择在使用默认字符串类型时调用哪个函数。

在内部,Windows使用Unicode。
SystemParametersInfoA
函数将ANSI参数字符串转换为Unicode,并在内部调用
SystemParametersInfoW
。在Python 2.x或3.x中,您可以从Python调用32位或64位。通常您希望W版本传递和检索Unicode字符串,因为Windows内部是Unicode的。A版本可能会丢失信息

在Python2或3、32位或64位中工作的示例。请注意,W版本在缓冲区中返回一个Unicode字符串,而a版本返回一个字节字符串

from __future__ import print_function
from ctypes import *
import sys

print(sys.version)
SPI_GETDESKWALLPAPER = 0x0073
dll = WinDLL('user32')
buf = create_string_buffer(200)
ubuf = create_unicode_buffer(200)
if dll.SystemParametersInfoA(SPI_GETDESKWALLPAPER,200,buf,0):
    print(buf.value)
if dll.SystemParametersInfoW(SPI_GETDESKWALLPAPER,200,ubuf,0):
    print(ubuf.value)
输出(Python 2.X 32位和Python 3.X 64位):


在内部,Windows使用Unicode。
SystemParametersInfoA
函数将ANSI参数字符串转换为Unicode,并在内部调用
SystemParametersInfoW
。在Python 2.x或3.x中,您可以从Python调用32位或64位。通常您希望W版本传递和检索Unicode字符串,因为Windows内部是Unicode的。A版本可能会丢失信息

在Python2或3、32位或64位中工作的示例。请注意,W版本在缓冲区中返回一个Unicode字符串,而a版本返回一个字节字符串

from __future__ import print_function
from ctypes import *
import sys

print(sys.version)
SPI_GETDESKWALLPAPER = 0x0073
dll = WinDLL('user32')
buf = create_string_buffer(200)
ubuf = create_unicode_buffer(200)
if dll.SystemParametersInfoA(SPI_GETDESKWALLPAPER,200,buf,0):
    print(buf.value)
if dll.SystemParametersInfoW(SPI_GETDESKWALLPAPER,200,ubuf,0):
    print(ubuf.value)
输出(Python 2.X 32位和Python 3.X 64位):


32位/64位完全是胡说八道。如果您的编程语言支持Unicode字符串,请继续使用Unicode版本-您不必担心正在运行的Windows版本。(嗯,除非你需要支持Windows 95/98/ME,或者16位Windows,我想。现在不太可能了!)文件/注册表名、窗口文本、用户名等都是Unicode。浏览ANSI API会给您提供一个比毫无价值的语言环境代码页的有损翻译更糟糕的结果。让代码页消失,用MS-DOS和Windows9.x(其核心基本上是一个32位DOS扩展器)将它们掩埋。这些旧系统上没有运行受支持的Python构建。Python 2的用户在调用WinAPI函数时应该使用
unicode
字符串,不幸的是,这在Unix和Windows代码之间造成了隔阂,但这只是跨平台代码的一个硬事实。32位/64位完全是胡说八道。如果您的编程语言支持Unicode字符串,请继续使用Unicode版本-您不必担心正在运行的Windows版本。(嗯,除非你需要支持Windows 95/98/ME,或者16位Windows,我想。现在不太可能了!)文件/注册表名、窗口文本、用户名等都是Unicode。浏览ANSI API会给您提供一个比毫无价值的语言环境代码页的有损翻译更糟糕的结果。让代码页消失,用MS-DOS和Windows9.x(其核心基本上是一个32位DOS扩展器)将它们掩埋。这些旧系统上没有运行受支持的Python构建。Python 2的用户在调用WinAPI函数时应该使用
unicode
字符串,不幸的是,这在Unix和Windows代码之间造成了隔阂,但这只是跨平台代码的一个硬事实。这是我的想法,但只是想确定一下。感谢您提供的样本输出以及!这是我的想法,但我只是想确定一下。感谢您提供的样本输出以及!我懂了。谢谢你提醒我关于支持两个ve的部分