From 74671a7f9e7126957df33a97b0ef7b0d6a87cf4c Mon Sep 17 00:00:00 2001 From: inkeliz Date: Mon, 10 Jun 2024 20:49:02 +0100 Subject: [PATCH] app/internal/windows: add SendMessage, FindWindow Also replace calls to the deprecated StringToUTF16Ptr syscall. Signed-off-by: inkeliz Signed-off-by: Elias Naur --- app/internal/windows/windows.go | 39 +++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/app/internal/windows/windows.go b/app/internal/windows/windows.go index b23392f3..a4c8c13a 100644 --- a/app/internal/windows/windows.go +++ b/app/internal/windows/windows.go @@ -108,6 +108,12 @@ type MonitorInfo struct { Flags uint32 } +type CopyDataStruct struct { + DwData uintptr + CbData uint32 + LpData uintptr +} + type POINTER_INPUT_TYPE int32 const ( @@ -315,6 +321,7 @@ const ( WM_CANCELMODE = 0x001F WM_CHAR = 0x0102 WM_CLOSE = 0x0010 + WM_COPYDATA = 0x004A WM_CREATE = 0x0001 WM_DPICHANGED = 0x02E0 WM_DESTROY = 0x0002 @@ -419,6 +426,7 @@ var ( _DefWindowProc = user32.NewProc("DefWindowProcW") _DestroyWindow = user32.NewProc("DestroyWindow") _DispatchMessage = user32.NewProc("DispatchMessageW") + _FindWindow = user32.NewProc("FindWindowW") _EmptyClipboard = user32.NewProc("EmptyClipboard") _EnableMouseInPointer = user32.NewProc("EnableMouseInPointer") _GetWindowRect = user32.NewProc("GetWindowRect") @@ -452,6 +460,7 @@ var ( _ReleaseDC = user32.NewProc("ReleaseDC") _ScreenToClient = user32.NewProc("ScreenToClient") _ShowWindow = user32.NewProc("ShowWindow") + _SendMessage = user32.NewProc("SendMessageW") _SetCapture = user32.NewProc("SetCapture") _SetCursor = user32.NewProc("SetCursor") _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) { - wname := syscall.StringToUTF16Ptr(lpWindowName) + wname, err := syscall.UTF16PtrFromString(lpWindowName) + if err != nil { + return 0, fmt.Errorf("CreateWindowEx failed: %v", err) + } hwnd, _, err := _CreateWindowEx.Call( uintptr(dwExStyle), uintptr(lpClassName), @@ -576,6 +588,18 @@ func EmptyClipboard() error { 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 { var r Rect _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) { - wname := syscall.StringToUTF16Ptr(title) + wname, err := syscall.UTF16PtrFromString(title) + if err != nil { + panic(err) + } _SetWindowText.Call(uintptr(hwnd), uintptr(unsafe.Pointer(wname))) } @@ -883,6 +910,14 @@ func ReleaseDC(hdc syscall.Handle) { _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) { _SetForegroundWindow.Call(uintptr(hwnd)) }