首頁  >  文章  >  後端開發  >  如何將Golang應用程式隱藏到工作列中

如何將Golang應用程式隱藏到工作列中

PHPz
PHPz原創
2023-03-30 09:05:18857瀏覽

Golang是一門高效能的程式語言,具有記憶體安全等優勢,因此越來越多的開發者開始使用這門語言進行開發。在Golang中,可以透過系統呼叫來實現各種操作,其中一個有趣的功能是將Golang應用程式隱藏到工作列中。

隱藏到工作列可以有效地保護應用程式的安全性,例如在某些情況下,我們可能不希望其他人知道我們正在運行的應用程式是哪一個。當然,這個功能也可以用來改善使用者體驗,例如在使用一些工具類應用程式時,可以將其隱藏到工作列中,從而不影響使用者的正常使用。

實作這個函數的方法是透過Golang的系統呼叫來實現。具體來說,需要使用win32 API中的Shell_NotifyIcon函數來將應用程式放入工作列。以下是實作程式碼:

package main

import (
    "strconv"
    "syscall"
    "unsafe"
)

var (
    user32     = syscall.MustLoadDLL("user32")
    shell32    = syscall.MustLoadDLL("shell32")
    kernel32   = syscall.MustLoadDLL("kernel32")
    MessageBox = user32.MustFindProc("MessageBoxW")
    _          = shell32.MustFindProc("Shell_NotifyIconW")
    GetCurrentProcessID = kernel32.MustFindProc("GetCurrentProcessId")
)

type NOTIFYICONDATA struct {
    cbSize           uint32
    hWnd             syscall.Handle
    uID              uint32
    uFlags           uint32
    uCallbackMessage uint32
    hIcon            syscall.Handle
    szTip            [128]uint16
}

const NIM_ADD = 0x00000000
const NIM_MODIFY = 0x00000001
const NIM_DELETE = 0x00000002
const NIF_MESSAGE = 0x00000001
const NIF_ICON = 0x00000002
const NIF_TIP = 0x00000004

func main() {
    procId, _, _ := GetCurrentProcessID.Call()
    hWnd := syscall.NewCallback(func(hwnd syscall.Handle, lParam uintptr) uintptr {
        return 0
    })
    nid := NOTIFYICONDATA{}
    nid.cbSize = uint32(unsafe.Sizeof(nid))
    nid.hWnd = syscall.Handle(hWnd)
    nid.uID = uint32(procId)
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP
    nid.hIcon = syscall.Handle(syscall.GetModuleHandle(nil))
    copy(nid.szTip[:], syscall.StringToUTF16("Golang 隐藏到任务栏"))
    Shell_NotifyIcon(NIM_ADD, unsafe.Pointer(&nid))
    MessageBox.Call(0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("按 OK 关闭"))), 0)
    Shell_NotifyIcon(NIM_DELETE, unsafe.Pointer(&nid))
}

func Shell_NotifyIcon(dwMessage uint32, pnid unsafe.Pointer) uint32 {
    ret, _, _ := shell32.MustFindProc("Shell_NotifyIconW").Call(
        uintptr(dwMessage),
        uintptr(pnid),
    )
    return uint32(ret)
}

在main函數中,我們先呼叫GetCurrentProcessID取得目前程序的ID,然後建立一個syscall.Handle類型的值hWnd用於表示目前應用程式的句柄。然後建立NOTIFYICONDATA類型的變數nid,並將其相關屬性設定好,其中包含uFlags為NIF_MESSAGE|NIF_ICON|NIF_TIP表示將應用程式放入工作列中。接著呼叫Shell_NotifyIcon函數將應用程式放入工作列中。

同時,我們也可以設定應用程式在工作列中的提示訊息。例如,我們將nid.szTip設定為"Golang 隱藏到工作列",這樣當使用者將遊標放在應用程式圖示上時,就可以看到對應提示訊息。

最後,我們在MessageBox.Call語句中等待使用者按下OK鍵,這樣應用程式就一直隱藏在工作列中。當用戶關閉應用程式時,我們再次呼叫Shell_NotifyIcon函數將應用程式從工作列中刪除即可。

總之,透過以上程式碼,我們可以輕鬆實現將Golang應用程式隱藏到工作列中的功能。當然,如果需要隱藏其他類型的應用程序,同樣也可以使用類似的方法來實現。

以上是如何將Golang應用程式隱藏到工作列中的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn