Files
2022-05-10 19:54:49 +08:00

40 lines
1.1 KiB
Go

package worker
import (
"fmt"
"runtime"
"syscall"
"github.com/lwch/natpass/code/client/rule/vnc/define"
"golang.org/x/sys/windows"
)
func attachDesktop() (func(), error) {
runtime.LockOSThread()
locked := true
oldDesktop, _, err := syscall.Syscall(define.FuncGetThreadDesktop, 1, uintptr(windows.GetCurrentThreadId()), 0, 0)
if oldDesktop == 0 {
runtime.UnlockOSThread()
return nil, fmt.Errorf("get thread desktop: %v", err)
}
desktop, _, err := syscall.Syscall(define.FuncOpenInputDesktop, 3, 0, 0, windows.GENERIC_ALL)
if desktop == 0 {
runtime.UnlockOSThread()
return nil, fmt.Errorf("open input desktop: %v", err)
}
ok, _, err := syscall.Syscall(define.FuncSetThreadDesktop, 1, desktop, 0, 0)
if ok == 0 {
syscall.Syscall(define.FuncCloseDesktop, 1, desktop, 0, 0)
runtime.UnlockOSThread()
return nil, fmt.Errorf("set thread desktop: %v", err)
}
return func() {
syscall.Syscall(define.FuncSetThreadDesktop, 1, oldDesktop, 0, 0)
syscall.Syscall(define.FuncCloseDesktop, 1, desktop, 0, 0)
if locked {
runtime.UnlockOSThread()
locked = false
}
}, nil
}