Python MessageBox with Icons using ctypes and windll

20,451

you just OR them together

import ctypes
MB_OK = 0x0
MB_OKCXL = 0x01
MB_YESNOCXL = 0x03
MB_YESNO = 0x04
MB_HELP = 0x4000
ICON_EXLAIM=0x30
ICON_INFO = 0x40
ICON_STOP = 0x10

result = ctypes.windll.user32.MessageBoxA(0, "Your text?", "Your title", MB_HELP| MB_YESNO | ICON_STOP)

I got the hex values from the documentation you linked to

Share:
20,451

Related videos on Youtube

MrBubbles
Author by

MrBubbles

GIS Analyst & Developer specializing in ESRI Products and Services.

Updated on December 03, 2020

Comments

  • MrBubbles
    MrBubbles over 3 years

    So, I'm looking for a way to create a simple Messagebox in Python using just the native libraries and came across several posts, but namely this one, leveraging ctypes to import the win32.dll and call its MessageboxA function.

    import ctypes  # An included library with Python install.
    ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1)
    

    Pretty cool stuff, I think.

    --- But ---

    When I when to look at the documentation for MessageboxA on Microsoft's site, turns out this MessageboxA function can do a whole lot more. I just don't know how to properly pass the parameters in.

    I'm trying to figure out the standard method for raising the messagebox with an icon in it, like the systemhand or warning icon beside the message. Microsoft's documentation indicates one should enter this into the uType parameter, which is the last one, but I haven't been able to make any progress here other than changing the messagebox's buttons.

  • MrBubbles
    MrBubbles over 9 years
    doh! thinking wayyyyyyy to hard about this. lol Thanks so much Joran
  • MrBubbles
    MrBubbles over 9 years
    Joran, can you tell me how you deciphered what those hex values were? The hex values you are using seem to be an abbreviated form of what microsoft shows on their site. I originally tried passing in the hex values microsoft indicates as they were, but they never worked. Yours do work, I just don't know how you got to 0x30 from 0x00000030L, which is the value microsoft's documentation indicates for the exclamation icon
  • Joran Beasley
    Joran Beasley over 9 years
    zeros on the left are not part of a number eg in decimal 97 is the same as 00097 ... I could have just as easily written 0x00000030 ... L just means long as in the datatype (any number that starts with 0x is just a hex number)
  • Mojimi
    Mojimi almost 7 years
    What is the reasoning that OR is what groups them together?
  • Joran Beasley
    Joran Beasley almost 7 years
    I dont understand your question? thats how you always combine integer flags in every example of anything ive ever seen ... I guess what informs it is my knowledge that when some one says "combine these integers" I know they mean or them together
  • Mojimi
    Mojimi almost 7 years
    @JoranBeasley Well if you say so, I just never even heard of "combining integers"
  • Joran Beasley
    Joran Beasley almost 7 years
    its very common in C/C++ ... much less so in python
  • Tiger-222
    Tiger-222 almost 5 years
    I would also use MessageBoxW() to deal correctly with unicode.