Topics

Python 3 and Windows API functions: please standardize around Unicode (wide character) functions unless justified otherwise

 

Hi all,

 

The following Python 3 porting directive applies to anyone working with Windows API functions, specifically ones requiring strings for certain operations:

 

August 2019 Python 3 add-on directive no. 1: standardize around Unicode (wide character) functions unless justified otherwise

 

Certain Windows API functions expect different string data format depending on which function signature is invoked:

 

  • *A: ANSI (bytes)
  • *W: Unicode (wide characters)

 

Functions defined this way include FindWindow, FindWindowEx, and others. Because Python 3 wants to use Unicode by default, you should call wide character functions (FindWindowW, for example) unless justified otherwise. If you absolutely need to use ANSI functions, please prefix strings with a “b” (without quotes).

 

Examples:

 

# Yes:

HWND = winUser.user32.FindWindowW(“windowClassName”, None) # strictly Python 3

HWND = winUser.user32.FindWindowA(b“ANSIClassName”, None) # Python 2 and 3

HWND = winUser.user32.FindWindowW(u”UnicodeClassName”, None) # Python 2 and 3

HWND = winUser.user32.FindWindowA(“windowClassName”, None) # strictly Python 2

 

# No:

HWND = winUser.user32.FindWindowA(“UnicodeClassName”, None) # No in Python 3

HWND = winUser.user32.FindWindowW(b”ANSIClassName”, None) # Wrong data type across Python versions

 

Of these, I recommend going with option 3 (from first list), as it guarantees widest compatibility.

 

The following add-ons are affected:

 

  • Dropbox
  • Extended Winamp
  • StationPlaylist
  • SystrayList
  • Many more

 

Add-ons noted above may load under NVDA 2019.3 alpha if manifests are modified. For add-ons hosted on community add-ons website, StationPlaylist and SystrayList passes this check.

 

Next steps: please contact add-on authors regarding their thoughts on compatibility.

 

Thanks.

Cheers,

Joseph

Brian's Mail list account
 

That explains why keypresses in extended winamp are ignored then as effectively their is a mismatch wheree there should be a match.
Brian

bglists@...
Sent via blueyonder.
Please address personal E-mail to:-
briang1@..., putting 'Brian Gaff'
in the display name field.
Newsgroup monitored: alt.comp.blind-users

----- Original Message -----
From: "Joseph Lee" <@joslee>
To: <nvda-devel@groups.io>
Sent: Saturday, August 03, 2019 2:11 AM
Subject: [nvda-devel] Python 3 and Windows API functions: please standardize around Unicode (wide character) functions unless justified otherwise


Hi all,



The following Python 3 porting directive applies to anyone working with
Windows API functions, specifically ones requiring strings for certain
operations:



August 2019 Python 3 add-on directive no. 1: standardize around Unicode
(wide character) functions unless justified otherwise



Certain Windows API functions expect different string data format depending
on which function signature is invoked:



* *A: ANSI (bytes)
* *W: Unicode (wide characters)



Functions defined this way include FindWindow, FindWindowEx, and others.
Because Python 3 wants to use Unicode by default, you should call wide
character functions (FindWindowW, for example) unless justified otherwise.
If you absolutely need to use ANSI functions, please prefix strings with a
"b" (without quotes).



Examples:



# Yes:

HWND = winUser.user32.FindWindowW("windowClassName", None) # strictly Python
3

HWND = winUser.user32.FindWindowA(b"ANSIClassName", None) # Python 2 and 3

HWND = winUser.user32.FindWindowW(u"UnicodeClassName", None) # Python 2 and
3

HWND = winUser.user32.FindWindowA("windowClassName", None) # strictly Python
2



# No:

HWND = winUser.user32.FindWindowA("UnicodeClassName", None) # No in Python 3

HWND = winUser.user32.FindWindowW(b"ANSIClassName", None) # Wrong data type
across Python versions



Of these, I recommend going with option 3 (from first list), as it
guarantees widest compatibility.



The following add-ons are affected:



* Dropbox
* Extended Winamp
* StationPlaylist
* SystrayList
* Many more



Add-ons noted above may load under NVDA 2019.3 alpha if manifests are
modified. For add-ons hosted on community add-ons website, StationPlaylist
and SystrayList passes this check.



Next steps: please contact add-on authors regarding their thoughts on
compatibility.



Thanks.

Cheers,

Joseph



 

Hi,
Correct. As I noted yesterday, there are other add-ons exhibiting this
issue, and I hope authors will take care of that when they are ready.
Cheers,
Joseph

-----Original Message-----
From: nvda-devel@groups.io <nvda-devel@groups.io> On Behalf Of Brian's Mail
list account via Groups.Io
Sent: Saturday, August 3, 2019 12:41 AM
To: nvda-devel@groups.io
Subject: Re: [nvda-devel] Python 3 and Windows API functions: please
standardize around Unicode (wide character) functions unless justified
otherwise

That explains why keypresses in extended winamp are ignored then as
effectively their is a mismatch wheree there should be a match.
Brian

bglists@...
Sent via blueyonder.
Please address personal E-mail to:-
briang1@..., putting 'Brian Gaff'
in the display name field.
Newsgroup monitored: alt.comp.blind-users
----- Original Message -----
From: "Joseph Lee" <@joslee>
To: <nvda-devel@groups.io>
Sent: Saturday, August 03, 2019 2:11 AM
Subject: [nvda-devel] Python 3 and Windows API functions: please standardize
around Unicode (wide character) functions unless justified otherwise


Hi all,



The following Python 3 porting directive applies to anyone working
with Windows API functions, specifically ones requiring strings for
certain
operations:



August 2019 Python 3 add-on directive no. 1: standardize around
Unicode (wide character) functions unless justified otherwise



Certain Windows API functions expect different string data format
depending on which function signature is invoked:



* *A: ANSI (bytes)
* *W: Unicode (wide characters)



Functions defined this way include FindWindow, FindWindowEx, and others.
Because Python 3 wants to use Unicode by default, you should call wide
character functions (FindWindowW, for example) unless justified otherwise.
If you absolutely need to use ANSI functions, please prefix strings with a
"b" (without quotes).



Examples:



# Yes:

HWND = winUser.user32.FindWindowW("windowClassName", None) # strictly
Python
3

HWND = winUser.user32.FindWindowA(b"ANSIClassName", None) # Python 2 and 3

HWND = winUser.user32.FindWindowW(u"UnicodeClassName", None) # Python 2
and
3

HWND = winUser.user32.FindWindowA("windowClassName", None) # strictly
Python
2



# No:

HWND = winUser.user32.FindWindowA("UnicodeClassName", None) # No in Python
3

HWND = winUser.user32.FindWindowW(b"ANSIClassName", None) # Wrong data
type
across Python versions



Of these, I recommend going with option 3 (from first list), as it
guarantees widest compatibility.



The following add-ons are affected:



* Dropbox
* Extended Winamp
* StationPlaylist
* SystrayList
* Many more



Add-ons noted above may load under NVDA 2019.3 alpha if manifests are
modified. For add-ons hosted on community add-ons website, StationPlaylist
and SystrayList passes this check.



Next steps: please contact add-on authors regarding their thoughts on
compatibility.



Thanks.

Cheers,

Joseph