Python - Windows SystemParametersInfoW 与 SystemParametersInfoA 函数之间的区别

Python - Difference Between Windows SystemParametersInfoW vs SystemParametersInfoA Function

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

在我编写的 Python 脚本中,我遇到了关于何时使用这些变体的两种不同解释。 This answer to a question says that for 64-bit machines you must use SystemParametersInfoW while for 32-bit machines you must use SystemParametersInfoA, thus you should run a function to determine which bit machine the script is running on. However, (and I've seen more people advocate for this type of answer) and here 表示 SystemParametersInfoW 必须 与 Python 3.x 一起使用,因为它传递 Unicode 字符串,而 SystemParametersInfoA 用于 Python 2.x 及以下,因为它传递了一个有利于 ANSI 的字节字符串。

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

On Windows 3.x/95/98/ME 很可能只有 SystemParametersInfoA 可以正常工作。在所有其他系统上,无论 OS 位数如何,A 和 W 风格都可以工作。

假设您只支持 Windows 的 "recent" 版本,您应该只选择最适合您的语言的风格,这通常意味着与中的默认字符串类型相匹配的风格你的语言。

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

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

适用于 Python 2 或 3、32 或 64 位的示例。请注意,W 版本 returns 缓冲区中的一个 Unicode 字符串,而 A 版本 returns 一个字节字符串。

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 位):

C:\>py -2 test.py
2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)]
c:\windows\web\wallpaper\theme1\img1.jpg
c:\windows\web\wallpaper\theme1\img1.jpg

C:\>py -3 test.py
3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]
b'c:\windows\web\wallpaper\theme1\img1.jpg'
c:\windows\web\wallpaper\theme1\img1.jpg