再议-Golang语言MessageBox用法实例

时间:2022-05-05
本文章向大家介绍再议-Golang语言MessageBox用法实例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

曾几何时,大多数人最先接触电脑的时候,windows是我们第一次的尝试遨游网络世界的媒介;作为IT民工加屌丝的我也是一样。现在从C++转换到GO语言,自己也同样会做些小软件,但是现在的GO并没有提供第三方包,以前有个开发包win的;但是现在网路已经找不到踪迹了,所以就打算自己实现下,编程除了工作就是爱好了,既然你我喜欢他,就把他做好尽量完美。

以下代码是windows的API的调用思路,共参考,后面我会做个QQ刷屏的软件,因为windows用MFC我实现过,之前发布到了VC驿站的原创文章如图:

QQ都是我的,那都是N多年前的事情了,我做过很多软件和视频教程。

package main

import (

       "syscall"

       "unsafe"

       "fmt"

)

func abort(funcname string, err int) {

       panic(funcname + " failed: " + syscall.Errno(err).Error())

}

var (

       kernel32, _ = syscall.LoadLibrary("kernel32.dll")

       getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")

       user32, _ = syscall.LoadLibrary("user32.dll")

       messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")

)

const (

       MB_OK                      = 0x00000000

       MB_OKCANCEL                = 0x00000001

       MB_ABORTRETRYIGNORE        = 0x00000002

       MB_YESNOCANCEL             = 0x00000003

       MB_YESNO                   = 0x00000004

       MB_RETRYCANCEL             = 0x00000005

       MB_CANCELTRYCONTINUE       = 0x00000006

       MB_ICONHAND                = 0x00000010

       MB_ICONQUESTION            = 0x00000020

       MB_ICONEXCLAMATION         = 0x00000030

       MB_ICONASTERISK            = 0x00000040

       MB_USERICON                = 0x00000080

       MB_ICONWARNING             = MB_ICONEXCLAMATION

       MB_ICONERROR               = MB_ICONHAND

       MB_ICONINFORMATION         = MB_ICONASTERISK

       MB_ICONSTOP                = MB_ICONHAND

       MB_DEFBUTTON1              = 0x00000000

       MB_DEFBUTTON2              = 0x00000100

       MB_DEFBUTTON3              = 0x00000200

       MB_DEFBUTTON4              = 0x00000300

)

func MessageBox(caption, text string, style uintptr) (result int) {

       // var hwnd HWND

       ret, _, callErr := syscall.Syscall6(uintptr(messageBox), 4,

               0, // HWND

               uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), // Text

               uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), // Caption

               style, // type

               0,

               0)

       if callErr != 0 {

               abort("Call MessageBox", int(callErr))

       }

       result = int(ret)

       return

}

func main() {

       defer syscall.FreeLibrary(kernel32)

       defer syscall.FreeLibrary(user32)

       fmt.Printf("Retern: %dn", MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL))

}

func init() {

       fmt.Print("Starting Upn")

}