Python - Difference Between Windows SystemParametersInfoW vs SystemParametersInfoA Function

前端 未结 2 562
抹茶落季
抹茶落季 2021-01-16 06:29

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

相关标签:
2条回答
  • 2021-01-16 06:52

    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.

    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)
    

    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
    
    0 讨论(0)
  • 2021-01-16 07:10

    On Windows 3.x/95/98/ME it is likely that only SystemParametersInfoA works correctly. On all other systems both the A and W flavor will work regardless of the OS bitness.

    Assuming you only support "recent" versions of Windows, you should just pick the flavor most comfortable for you to use in your language and that usually means the flavor that matches the default string type in your language.

    If you want to support both Python v2 & v3 you would have to choose at run-time which function to call if you are using the default string type.

    0 讨论(0)
提交回复
热议问题