使用本机Golang API在Windows上添加图标托盘

Bap*_*aux 13 windows systray go

我正在开发一个没有UI的守护进程,除了Windows系统中的简单图标.

我想对任何其他软件包没有依赖关系,所以我试图使用syscall软件包并自己实现必要的调用.

文档

图书馆

履行

结构

使用xilp/systray文档构建.

type HANDLE uintptr

type HICON HANDLE
    type HWND HANDLE

type GUID struct {
    Data1 uint32
    Data2 uint16
    Data3 uint16
    Data4 [8]byte
}

type NOTIFYICONDATA struct {
    CbSize           uint32
    HWnd             HWND
    UID              uint32
    UFlags           uint32
    UCallbackMessage uint32
    HIcon            HICON
    SzTip            [128]uint16
    DwState          uint32
    DwStateMask      uint32
    SzInfo           [256]uint16
    UVersion         uint32
    SzInfoTitle      [64]uint16
    DwInfoFlags      uint32
    GuidItem         GUID
}
Run Code Online (Sandbox Code Playgroud)

变量

const (
    NIM_ADD = 0x00000000
    NIM_MODIFY = 0x00000001
    NIM_DELETE = 0x00000002
    NIM_SETVERSION = 0x00000004

    NIF_MESSAGE = 0x00000001
    NIF_ICON = 0x00000002
    NIF_TIP = 0x00000004
    NIF_STATE = 0x00000008

    NIF_HIDDEN = 0x00000001
)
Run Code Online (Sandbox Code Playgroud)

资源

package main

import (
    "log"
    "syscall"
    "unsafe"
)

func main() {
    shell32 := syscall.MustLoadDLL("shell32.dll")
    Shell_NotifyIcon := shell32.MustFindProc("Shell_NotifyIconW")

    iconData := NOTIFYICONDATA{
        HWnd: 0,
        UFlags: NIF_MESSAGE | NIF_STATE,
        DwState: NIF_HIDDEN,
        DwStateMask: NIS_HIDDEN,
    }
    iconData.CbSize = uint32(unsafe.Sizeof(iconData))

    ret, _, _ := Shell_NotifyIcon.Call(
        NIM_ADD,
        uintptr(unsafe.Pointer(&iconData)),
    )

    if ret == 0 {
        log.Println("Failed")
        return
    }

    // Do anything, like open a HTTP server to keep the program running
    http.ListenAndServe(":8080", nil)
}
Run Code Online (Sandbox Code Playgroud)

细节

  • 我不知道要提供什么信息HWnd,但没有它,可执行文件崩溃了.
  • UFlags,DwStateDwStateMask拥有我在不同项目中找到的价值观.

我知道这是可能的; 在Golang WIKI给调用一个消息框的实现.

hal*_*ang 2

领域NOTIFYICONDATA

hWnd

hWnd字段NOTIFYICONDATA保存与 notificationicon 本身关联的窗口句柄,如 MSDN 中所述:

hWnd

接收与通知区域中的图标关联的通知的窗口句柄。

我发现有必要关联一个窗口句柄,即使窗口不可见。

uFlags告诉哪些字段NOTIFYICONDATA在单个命令中有效。如您所见, 中有很多字段NOTIFYICONDATA,如果您只想更改通知图标,则可以保留其他字段不变并仅设置hIcon字段,然后将整个NOTIFYICONDATA字段传递给Shell_NotifyIcon。如果您想同时更改图标和消息,只需将其设置为NIF_MESSAGE|NIF_ICON

数据状态

dwState可用于控制图标的可见性。如果您指定NIF_STATEfor uFlagsNIS_HIDDENfordwStatedwStateMask,它将隐藏通知图标。

dw状态掩码

大多数情况下,只需设置dwStateMask为相同即可dwState。它只是告诉哪一位dwState对命令有效:

可能的值与 dwState 的值相同。

例子

您可以在这里找到我写的完整示例: https: //github.com/hallazzang/go-windows-programming/tree/master/example/gui/notifyicon