Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to specify what actually happens when Yes/No is clicked with ctypes MessageBoxW?

def addnewunit(title, text, style):
    ctypes.windll.user32.MessageBoxW(0, text, title, style)

Ive seen a lot of people show this code, however nobody has ever specified how to actually make the Yes/No work. Theyre buttons, and they are there, however how does one specify what actually happens when you click either or?

like image 781
Ryan Mansuri Avatar asked Sep 14 '25 22:09

Ryan Mansuri


2 Answers

Something like this with proper ctypes wrapping:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ctypes
from ctypes.wintypes import HWND, LPWSTR, UINT

_user32 = ctypes.WinDLL('user32', use_last_error=True)

_MessageBoxW = _user32.MessageBoxW
_MessageBoxW.restype = UINT  # default return type is c_int, this is not required
_MessageBoxW.argtypes = (HWND, LPWSTR, LPWSTR, UINT)

MB_OK = 0
MB_OKCANCEL = 1
MB_YESNOCANCEL = 3
MB_YESNO = 4

IDOK = 1
IDCANCEL = 2
IDABORT = 3
IDYES = 6
IDNO = 7


def MessageBoxW(hwnd, text, caption, utype):
    result = _MessageBoxW(hwnd, text, caption, utype)
    if not result:
        raise ctypes.WinError(ctypes.get_last_error())
    return result


def main():
    try:
        result = MessageBoxW(None, "text", "caption", MB_YESNOCANCEL)
        if result == IDYES:
            print("user pressed ok")
        elif result == IDNO:
            print("user pressed no")
        elif result == IDCANCEL:
            print("user pressed cancel")
        else:
            print("unknown return code")
    except WindowsError as win_err:
        print("An error occurred:\n{}".format(win_err))

if __name__ == "__main__":
    main()

See the documentation for MessageBox for the various value of the utype argument.

like image 150
Neitsa Avatar answered Sep 16 '25 13:09

Neitsa


Quoting official docs:

Return value

Type: int

If a message box has a Cancel button, the function returns the IDCANCEL value if either the ESC key is pressed or the Cancel button is selected. If the message box has no Cancel button, pressing ESC has no effect. If the function fails, the return value is zero. To get extended error information, call GetLastError. If the function succeeds, the return value is one of the following menu-item values

You may checked listed values under official docs link.

Sample code would be something like:

def addnewunit(title, text, style):
    ret_val = ctypes.windll.user32.MessageBoxW(0, text, title, style)
    if ret_val == 0:
        raise Exception('Oops')
    elif ret_val == 1:
        print "OK Clicked"
    ...  # additional conditional checks of ret_val may go here
like image 41
Łukasz Rogalski Avatar answered Sep 16 '25 13:09

Łukasz Rogalski