-
Notifications
You must be signed in to change notification settings - Fork 1
/
getTopWindowOnWindows.go
85 lines (78 loc) · 1.77 KB
/
getTopWindowOnWindows.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// 获取Windows当前窗口并给另外一个机器发通知
// cloud@txthinking.com
//
package main
import (
"syscall"
"unsafe"
"net"
"time"
"bufio"
"io"
"fmt"
)
var (
moduser32 = syscall.NewLazyDLL("user32.dll")
procGetForegroundWindow = moduser32.NewProc("GetForegroundWindow")
procGetClassNameW = moduser32.NewProc("GetClassNameW")
)
func GetForegroundWindow() (hwnd syscall.Handle, err error) {
r0, _, e1 := syscall.Syscall(procGetForegroundWindow.Addr(), 0, 0, 0, 0)
if e1 != 0 {
err = error(e1)
return
}
hwnd = syscall.Handle(r0)
return
}
func GetClassName(hwnd syscall.Handle) (name string, err error) {
n := make([]uint16, 256)
p := &n[0]
r0, _, e1 := syscall.Syscall(procGetClassNameW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(p)), uintptr(len(n)))
if r0 == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
return
}
name = syscall.UTF16ToString(n)
return
}
func TellMe(){
nc, _ := net.Dial("tcp", "192.168.2.9:13000")
fmt.Fprintf(nc, "HI\n")
br := bufio.NewReader(nc)
for{
line, err := br.ReadString('\n')
if err==io.EOF {
break
}
if line == "OVER\n"{
break
}
}
nc.Close()
}
func main (){
var last string
for{
func(){
h,_ := GetForegroundWindow()
r,_ := GetClassName(h)
if len(r) <= 0 {
return
}
if r[0:1] == "#"{
if r != last{
TellMe()
last = r
}
}else{
last = r
}
}()
time.Sleep(time.Second)
}
}