如何使用ctypes MessageBoxW单击是/否时指定实际发生的情况?

时间:2016-01-17 16:47:24

标签: python python-2.7 python-3.x ctypes

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

我见过很多人都展示了这段代码,但是没有人说过如何真正做出是/否的工作。它们是按钮,它们在那里,但是如何指定单击或者?

时实际发生的情况

4 个答案:

答案 0 :(得分:4)

使用正确的ctypes包装这样的东西:

#!/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 = 0
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()

有关utype参数的各种值,请参阅MessageBox的the documentation

答案 1 :(得分:1)

引用official docs

  

返回值

     

输入:int

     

如果消息框中有“取消”按钮,则该函数返回   如果按下ESC键或取消,则为IDCANCEL值   按钮被选中。如果消息框中没有“取消”按钮,请按   ESC无效。 如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。 如果功能   成功后,返回值是以下菜单项值之一

您可以在官方文档链接下查看列出的值。

示例代码如下:

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

答案 2 :(得分:1)

您将答案设置为等于命令,如下所示:

import ctypes
answer = ctypes.windll.user32.MessageBoxW(0, "Message", "Title", 4) 

然后您就可以使用

print(answer)

查看用户选择的结果是多少。

然后根据答案编号使用“ If”语句使它执行您想要的操作。

答案 3 :(得分:0)

其他答案显示返回值表示按下了什么按钮,但是如果您不想查找所有常量值,请使用pywin32,它已经包含了大部分Windows API(演示)在中文中显示它正在调用Unicode API):

#coding:utf8
import win32api
import win32con
result = win32api.MessageBox(None,'你是美国人吗?','问题',win32con.MB_YESNO)
if result == win32con.IDYES:
    print('是')
else:
    print('不是')