W Thirty Two Msg Box (original) (raw)
Contents
Multi-line message box
(defun multiline-message-box (msg)
"display a multiline message box on Windows.
According to bug #11138, when passing a message with newlines to
`message-box' on Windows, the rendered message-box appears all on
one line.
This function can work around that problem.
"
(flet ((ok (&optional p1 &rest args) t))
(let ((parts (split-string msg "\n"))
(menu-1 (make-sparse-keymap "Attention"))
c)
(define-key menu-1 [menu-1-ok-event]
`(menu-item ,(purecopy "OK")
ok
:keys ""))
(define-key menu-1 [separator-1] menu-bar-separator)
;; add lines in reverse order
(setq c (length parts))
(while (> c 0)
(setq c (1- c))
(define-key menu-1 (vector (intern (format "menu-1-fake-event-%d" c)))
`(menu-item ,(purecopy (nth c parts))
nil
:keys ""
:enable t)))
(x-popup-menu t menu-1))))
Messagebox via Powershell
The built-in message-box fn on Windows is sort of broken, and it’s also not particularly beautiful or functional either. This fn allows you to pop a message box using Powershell, which is builtin to all Windows.
(defun msgbox-via-powershell (format-string &rest args)
"display a message box via powershell and Windows Forms.
"
(flet ((rris (a1 a2 s) (replace-regexp-in-string a1 a2 s)))
(let ((msg (format format-string args)))
(let ((powershell-exe (concat
(getenv "windir")
"\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"))
(ps-cmd
(concat "[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');"
"[Windows.Forms.MessageBox]::Show("
(mapconcat '(lambda (elt)
(rris (char-to-string 34)
(char-to-string 39)
(pp-to-string
(rris (char-to-string 34)
"'+[char]0x0022+'"
(rris (char-to-string 39)
"'+[char]0x0027+'"
elt)
))))
(split-string msg "\n" nil)
"+[char]0x000D+")
",'Message from Emacs',"
"[Windows.Forms.MessageBoxButtons]::OK,"
"[Windows.Forms.MessageBoxIcon]::Information)"))
shell-command)
(setq shell-command
(format "%s -Command %s"
powershell-exe
(concat "\"& {" ps-cmd "}\"")))
(shell-command-on-region (point) (point)
shell-command
nil nil nil)))))
W32-MSGBOX
For when the error- or message-functions in emacs on w32 is not enough for you.
The latest version is 0.3 and was posted 2004-02-24, around 170.00 CET.
- It relies on the cscript.exe vbscript interpreter. If it is not available (quite uncommon if you’re not extremely paranoid), well, bad luck!
Test it with:
M-: (w32-msgbox "Message" "Title" 'vb-yes-no-cancel 'vb-question 'vb-default-button-2 t)