mirror of https://github.com/Wox-launcher/Wox
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package window
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lpsapi -lgdi32 -luser32 -lshell32
|
|
#include <windows.h>
|
|
#include <psapi.h>
|
|
#include <shellapi.h>
|
|
|
|
char* getActiveWindowIcon(unsigned char **iconData, int *iconSize, int *width, int *height);
|
|
char* getActiveWindowName();
|
|
int getActiveWindowPid();
|
|
*/
|
|
import "C"
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
"image/color"
|
|
"unsafe"
|
|
)
|
|
|
|
func GetActiveWindowIcon() (image.Image, error) {
|
|
var iconData *C.uchar
|
|
var iconSize C.int
|
|
var width, height C.int
|
|
|
|
errMsgC := C.getActiveWindowIcon(&iconData, &iconSize, &width, &height)
|
|
if errMsgC != nil {
|
|
errMsg := C.GoString(errMsgC)
|
|
return nil, fmt.Errorf("failed to get active window icon: %s", errMsg)
|
|
}
|
|
defer C.free(unsafe.Pointer(iconData))
|
|
|
|
data := C.GoBytes(unsafe.Pointer(iconData), iconSize)
|
|
img := image.NewRGBA(image.Rect(0, 0, int(width), int(height)))
|
|
|
|
idx := 0
|
|
for y := 0; y < int(height); y++ {
|
|
for x := 0; x < int(width); x++ {
|
|
img.SetRGBA(x, y, color.RGBA{
|
|
R: data[idx+2],
|
|
G: data[idx+1],
|
|
B: data[idx],
|
|
A: data[idx+3],
|
|
})
|
|
idx += 4
|
|
}
|
|
}
|
|
|
|
return img, nil
|
|
}
|
|
|
|
func GetActiveWindowName() string {
|
|
cStr := C.getActiveWindowName()
|
|
if cStr == nil {
|
|
return ""
|
|
}
|
|
defer C.free(unsafe.Pointer(cStr))
|
|
length := C.int(C.strlen(cStr))
|
|
bytes := C.GoBytes(unsafe.Pointer(cStr), length)
|
|
return string(bytes)
|
|
}
|
|
|
|
func GetActiveWindowPid() int {
|
|
pid := C.getActiveWindowPid()
|
|
return int(pid)
|
|
}
|