forked from joejulian/gio
app/internal/windows: add SendMessage, FindWindow
Also replace calls to the deprecated StringToUTF16Ptr syscall. Signed-off-by: inkeliz <inkeliz@inkeliz.com> Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -108,6 +108,12 @@ type MonitorInfo struct {
|
|||||||
Flags uint32
|
Flags uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CopyDataStruct struct {
|
||||||
|
DwData uintptr
|
||||||
|
CbData uint32
|
||||||
|
LpData uintptr
|
||||||
|
}
|
||||||
|
|
||||||
type POINTER_INPUT_TYPE int32
|
type POINTER_INPUT_TYPE int32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -315,6 +321,7 @@ const (
|
|||||||
WM_CANCELMODE = 0x001F
|
WM_CANCELMODE = 0x001F
|
||||||
WM_CHAR = 0x0102
|
WM_CHAR = 0x0102
|
||||||
WM_CLOSE = 0x0010
|
WM_CLOSE = 0x0010
|
||||||
|
WM_COPYDATA = 0x004A
|
||||||
WM_CREATE = 0x0001
|
WM_CREATE = 0x0001
|
||||||
WM_DPICHANGED = 0x02E0
|
WM_DPICHANGED = 0x02E0
|
||||||
WM_DESTROY = 0x0002
|
WM_DESTROY = 0x0002
|
||||||
@@ -419,6 +426,7 @@ var (
|
|||||||
_DefWindowProc = user32.NewProc("DefWindowProcW")
|
_DefWindowProc = user32.NewProc("DefWindowProcW")
|
||||||
_DestroyWindow = user32.NewProc("DestroyWindow")
|
_DestroyWindow = user32.NewProc("DestroyWindow")
|
||||||
_DispatchMessage = user32.NewProc("DispatchMessageW")
|
_DispatchMessage = user32.NewProc("DispatchMessageW")
|
||||||
|
_FindWindow = user32.NewProc("FindWindowW")
|
||||||
_EmptyClipboard = user32.NewProc("EmptyClipboard")
|
_EmptyClipboard = user32.NewProc("EmptyClipboard")
|
||||||
_EnableMouseInPointer = user32.NewProc("EnableMouseInPointer")
|
_EnableMouseInPointer = user32.NewProc("EnableMouseInPointer")
|
||||||
_GetWindowRect = user32.NewProc("GetWindowRect")
|
_GetWindowRect = user32.NewProc("GetWindowRect")
|
||||||
@@ -452,6 +460,7 @@ var (
|
|||||||
_ReleaseDC = user32.NewProc("ReleaseDC")
|
_ReleaseDC = user32.NewProc("ReleaseDC")
|
||||||
_ScreenToClient = user32.NewProc("ScreenToClient")
|
_ScreenToClient = user32.NewProc("ScreenToClient")
|
||||||
_ShowWindow = user32.NewProc("ShowWindow")
|
_ShowWindow = user32.NewProc("ShowWindow")
|
||||||
|
_SendMessage = user32.NewProc("SendMessageW")
|
||||||
_SetCapture = user32.NewProc("SetCapture")
|
_SetCapture = user32.NewProc("SetCapture")
|
||||||
_SetCursor = user32.NewProc("SetCursor")
|
_SetCursor = user32.NewProc("SetCursor")
|
||||||
_SetClipboardData = user32.NewProc("SetClipboardData")
|
_SetClipboardData = user32.NewProc("SetClipboardData")
|
||||||
@@ -504,7 +513,10 @@ func CloseClipboard() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CreateWindowEx(dwExStyle uint32, lpClassName uint16, lpWindowName string, dwStyle uint32, x, y, w, h int32, hWndParent, hMenu, hInstance syscall.Handle, lpParam uintptr) (syscall.Handle, error) {
|
func CreateWindowEx(dwExStyle uint32, lpClassName uint16, lpWindowName string, dwStyle uint32, x, y, w, h int32, hWndParent, hMenu, hInstance syscall.Handle, lpParam uintptr) (syscall.Handle, error) {
|
||||||
wname := syscall.StringToUTF16Ptr(lpWindowName)
|
wname, err := syscall.UTF16PtrFromString(lpWindowName)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("CreateWindowEx failed: %v", err)
|
||||||
|
}
|
||||||
hwnd, _, err := _CreateWindowEx.Call(
|
hwnd, _, err := _CreateWindowEx.Call(
|
||||||
uintptr(dwExStyle),
|
uintptr(dwExStyle),
|
||||||
uintptr(lpClassName),
|
uintptr(lpClassName),
|
||||||
@@ -576,6 +588,18 @@ func EmptyClipboard() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FindWindow(lpClassName string) (syscall.Handle, error) {
|
||||||
|
className, err := syscall.UTF16PtrFromString(lpClassName)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("FindWindow failed: %v", err)
|
||||||
|
}
|
||||||
|
hwnd, _, err := _FindWindow.Call(uintptr(unsafe.Pointer(className)), 0)
|
||||||
|
if hwnd == 0 {
|
||||||
|
return 0, fmt.Errorf("FindWindow failed: %v", err)
|
||||||
|
}
|
||||||
|
return syscall.Handle(hwnd), nil
|
||||||
|
}
|
||||||
|
|
||||||
func GetWindowRect(hwnd syscall.Handle) Rect {
|
func GetWindowRect(hwnd syscall.Handle) Rect {
|
||||||
var r Rect
|
var r Rect
|
||||||
_GetWindowRect.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&r)))
|
_GetWindowRect.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&r)))
|
||||||
@@ -767,7 +791,10 @@ func SetWindowPos(hwnd syscall.Handle, hwndInsertAfter uint32, x, y, dx, dy int3
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SetWindowText(hwnd syscall.Handle, title string) {
|
func SetWindowText(hwnd syscall.Handle, title string) {
|
||||||
wname := syscall.StringToUTF16Ptr(title)
|
wname, err := syscall.UTF16PtrFromString(title)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
_SetWindowText.Call(uintptr(hwnd), uintptr(unsafe.Pointer(wname)))
|
_SetWindowText.Call(uintptr(hwnd), uintptr(unsafe.Pointer(wname)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -883,6 +910,14 @@ func ReleaseDC(hdc syscall.Handle) {
|
|||||||
_ReleaseDC.Call(uintptr(hdc))
|
_ReleaseDC.Call(uintptr(hdc))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SendMessage(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) error {
|
||||||
|
r, _, err := _SendMessage.Call(uintptr(hwnd), uintptr(msg), wParam, lParam)
|
||||||
|
if r == 0 {
|
||||||
|
return fmt.Errorf("SendMessage failed: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func SetForegroundWindow(hwnd syscall.Handle) {
|
func SetForegroundWindow(hwnd syscall.Handle) {
|
||||||
_SetForegroundWindow.Call(uintptr(hwnd))
|
_SetForegroundWindow.Call(uintptr(hwnd))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user