Python-Windows SystemParametersInfoW与SystemParametersInfoA函数之间的区别 [英] Python - Difference Between Windows SystemParametersInfoW vs SystemParametersInfoA Function

查看:533
本文介绍了Python-Windows SystemParametersInfoW与SystemParametersInfoA函数之间的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a quick question that I cannot seem to clarify, despite my research on Stack Overflow and beyond. My questions involves the Windows SystemParametersInfo function with its variants SystemParametersInfoW (Unicode) and SystemParametersInfoA (ANSI) in relation to a Python 3.x script.

在我编写的Python脚本中,我遇到了两种不同的解释来说明何时使用这些变体。 这个问题的答案说,对于64位计算机,您必须使用SystemParametersInfoW,而对于32位计算机,您必须使用SystemParametersInfoA ,因此您应该运行一个函数来确定脚本在哪台位机上运行。但是,这里还有一个答案(而且我看到更多的人主张这种答案)和此处表示SystemParametersInfoW 必须与Python 3.x一起使用,因为它传递Unicode字符串,而SystemParametersInfoA用于Python 2.x及以下版本,因为它传递了一个有利于ANSI的字节字符串。

In a Python script I am writing, I came across two different explanations into when to use these variants. 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, another answer here (and I've seen more people advocate for this type of answer) and here says that SystemParametersInfoW must be used with Python 3.x since it passes a Unicode string while SystemParametersInfoA is used for Python 2.x and below since it passes a byte string conducive with ANSI.

那么这里的正确答案是什么,因为我需要对脚本进行不同的处理?同样,我使用的是Python 3.5,因此第二个答案很合适,但是在使用SystemParametersInfoW和SystemParametersInfoA之间,机器的某些事实是否存在因素呢?是这两个答案的混合,还是我应该继续使用SystemParametersInfoW,而不管它是否将在32位或64位计算机上使用?我什至需要确定运行脚本的计算机的哪个位?感谢您为澄清此问题所提供的帮助!

So what is the right answer here as I would need to proceed forward differently with my script? Again, I am using Python 3.5 so it would make sense that the second answer fits, however is there any truth in the bit of the machine being a factor between using SystemParametersInfoW and SystemParametersInfoA? Is it a mixture of both answers or should I go ahead and use SystemParametersInfoW regardless of whether it will be used on a 32 or 64 bit machine? Do I even need to determine the bit of the machine the script is running on? Thank you for your help in clarifying this issue!

推荐答案

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

Internally, Windows uses Unicode. The SystemParametersInfoA function converts ANSI parameter strings to Unicode and internally calls SystemParametersInfoW. You can call either from Python whether 32- or 64-bit, in Python 2.x or 3.x. Usually you want the W version to pass and retrieve Unicode strings since Windows is internally Unicode. The A version can lose information.

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

Example that works in Python 2 or 3, 32- or 64-bit. Note that the W version returns a Unicode string in the buffer, while the A version returns a byte string.

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

Output (Python 2.X 32-bit and Python 3.X 64-bit):

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

这篇关于Python-Windows SystemParametersInfoW与SystemParametersInfoA函数之间的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆