如何获取Windows应用程序的位置和区域(例如“Google Chrome”)? [关闭]

问题描述 投票:-3回答:1

我如何获得pid和Handle,然后获得位置?

我对此没有任何线索。请忽略以下代码。

package main

import (
    "fmt"

    "syscall"
)

func main () {
    if err := syscall.Setregid(int(233), int(233)); err != nil {
        fmt.Println("setregid:", err)
    }
}
winapi go
1个回答
1
投票

尽管您发布了代码(这只能在Linux下运行),但每个人似乎都在假设您在Windows下询问它是如何完成的。

正如@ remy-lebeau所提到的,你可以使用FindWindow()GetWindowRect()来实现这个目的:

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

type HWND uintptr

type RECT struct {
    Left, Top, Right, Bottom int32
}

var (
    user32, _     = syscall.LoadLibrary("user32.dll")
    findWindowW, _ = syscall.GetProcAddress(user32, "FindWindowW")
    getWindowRect, _ = syscall.GetProcAddress(user32, "GetWindowRect")
)

//HWND WINAPI FindWindow(
//  _In_opt_ LPCTSTR lpClassName,
//  _In_opt_ LPCTSTR lpWindowName
//);
func FindWindowByTitle(title string) HWND {
    ret, _, _ := syscall.Syscall(
        findWindowW,
        2,
        0,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))),
        0,
    )
    return HWND(ret)
}

//BOOL WINAPI GetWindowRect(
//  _In_  HWND   hWnd,
//  _Out_ LPRECT lpRect
//);
func GetWindowDimensions(hwnd HWND) *RECT {
    var rect RECT

    syscall.Syscall(
        getWindowRect,
        2,
        uintptr(hwnd),
        uintptr(unsafe.Pointer(&rect)),
        0,
    )

    return &rect
}

func main() {
    defer syscall.FreeLibrary(user32)

    hwnd := FindWindowByTitle("New Tab - Google Chrome")
    fmt.Printf("Return: %d\n", hwnd)

    if hwnd > 0 {
        rect := GetWindowDimensions(hwnd)
        fmt.Printf("Return: %v\n", rect)
    }
}

请注意,为简洁起见,不会进行错误处理。

© www.soinside.com 2019 - 2024. All rights reserved.