73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
|
// 9 february 2014
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
// "syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
// SendMessage constants.
|
||
|
const (
|
||
|
HWND_BROADCAST = HWND(0xFFFF)
|
||
|
)
|
||
|
|
||
|
type MSG struct {
|
||
|
Hwnd HWND
|
||
|
Message uint32
|
||
|
WParam WPARAM
|
||
|
LParam LPARAM
|
||
|
Time uint32
|
||
|
Pt POINT
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
dispatchMessage = user32.NewProc("DispatchMessageW")
|
||
|
getMessage = user32.NewProc("GetMessageW")
|
||
|
postQuitMessage = user32.NewProc("PostQuitMessage")
|
||
|
sendMessage = user32.NewProc("SendMessageW")
|
||
|
translateMessage = user32.NewProc("TranslateMessage")
|
||
|
)
|
||
|
|
||
|
// TODO handle errors
|
||
|
func DispatchMessage(lpmsg *MSG) (result LRESULT, err error) {
|
||
|
r1, _, _ := dispatchMessage.Call(uintptr(unsafe.Pointer(lpmsg)))
|
||
|
return LRESULT(r1), nil
|
||
|
}
|
||
|
|
||
|
var getMessageFail = -1 // because Go doesn't let me
|
||
|
|
||
|
func GetMessage(hWnd HWND, wMsgFilterMin uint32, wMsgFilterMax uint32) (lpMsg *MSG, quit bool, err error) {
|
||
|
lpMsg = new(MSG)
|
||
|
r1, _, err := getMessage.Call(
|
||
|
uintptr(unsafe.Pointer(lpMsg)),
|
||
|
uintptr(hWnd),
|
||
|
uintptr(wMsgFilterMin),
|
||
|
uintptr(wMsgFilterMax))
|
||
|
if r1 == uintptr(getMessageFail) { // failure
|
||
|
return nil, false, err
|
||
|
}
|
||
|
return lpMsg, r1 == 0, nil
|
||
|
}
|
||
|
|
||
|
// TODO handle errors
|
||
|
func PostQuitMessage(nExitCode int) (err error) {
|
||
|
postQuitMessage.Call(uintptr(nExitCode))
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// TODO handle errors
|
||
|
func SendMessage(hWnd HWND, Msg uint32, wParam WPARAM, lParam LPARAM) (result LRESULT, err error) {
|
||
|
r1, _, _ := sendMessage.Call(
|
||
|
uintptr(hWnd),
|
||
|
uintptr(Msg),
|
||
|
uintptr(wParam),
|
||
|
uintptr(lParam))
|
||
|
return LRESULT(r1), nil
|
||
|
}
|
||
|
|
||
|
// TODO handle errors
|
||
|
func TranslateMessage(lpMsg *MSG) (translated bool, err error) {
|
||
|
r1, _, _ := translateMessage.Call(uintptr(unsafe.Pointer(lpMsg)))
|
||
|
return r1 != 0, nil
|
||
|
}
|