Windows systray の単純なアイコン以外に UI のないデーモンを開発しています。
他のパッケージに依存したくないので、syscall
パッケージを使用して必要な呼び出しを自分で実装しようとしています。
ドキュメンテーション
Shell_NotifyIcon
いくつかの調査の後、関数を で使用する必要があると思いますshell32.dll
。- Golang WIKI には、Windows DLL を呼び出す 3 つの方法があります。3番目の解決策は除外されます。多くの理由から、Golang コンパイラのみでソースをビルドしたいと考えています。
- 「Developing for Multiple Platforms With Go」で興味深い記事を見つけました
Shell_NotifyIconW
(Unicode の偏角) の使用方法が説明されていますが、実装は部分的です。 - Windows システム トレイを実装する Golang ライブラリをいくつか見つけました。それらは、構造とそれを処理するための呼び出しを理解するのに役立ちます。
ライブラリ
実装
構造物
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
}
変数
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
がないと実行可能ファイルがクラッシュします。 UFlags
、さまざまなプロジェクトで見つけた値DwState
をDwStateMask
持っています。
私はそれが可能であることを知っています。Golang WIKIは、メッセージ ボックスを呼び出すための実装を提供します。