gpt4 book ai didi

windows - 使用原生 Golang API 在 Windows 上添加图标托盘

转载 作者:行者123 更新时间:2023-12-01 18:22:29 27 4
gpt4 key购买 nike

我正在开发一个守护程序,除了 Windows 系统托盘中的一个简单图标外,没有任何 UI。

我不想依赖任何其他包,因此我尝试使用 syscall 包并自己实现必要的调用。

文档

实现

结构

使用 xilp/systray documentation 构建.

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
}

变量

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
)

来源

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)
}

详细信息

  • 我不知道要在 HWnd 中提供什么信息,但如果没有它,可执行文件就会崩溃。
  • UFlagsDwStateDwStateMask 具有我在不同项目中找到的值。

我知道这是可能的; Golang WIKI给出了调用消息框的实现。

最佳答案

NOTIFYICONDATA 的字段

hWnd

hWnd NOTIFYICONDATA领域保存与notifyicon本身关联的窗口句柄,如MSDN中所述:

hWnd

A handle to the window that receives notifications associated with an icon in the notification area.

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

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

dw状态

dwState可用于控制图标的可见性。如果指定NIF_STATE对于 uFlags ,和NIS_HIDDEN对于 dwStatedwStateMask ,它会使通知图标隐藏。

dwStateMask

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

The possible values are the same as those for dwState.

示例

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

关于windows - 使用原生 Golang API 在 Windows 上添加图标托盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49126294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com