Как я могу управлять окнами приложений, открытых с помощью Win32 API (Блокнот, Word, Outlook, Chrome и т. Д.)

Как мы можем управлять функцией wndproc приложений, которые мы запускаем с помощью Win32 api? Я использую программный язык Go.

Я пробовал более одного метода, но не смог. Вы можете помочь?

Я изучаю значение HANDLE (HWND) приложения блокнота с помощью Microsoft Spy ++

Затем я смотрю изменения в Notepad ++ по сравнению с SPY ++.

Как и в случае со Spy ++, пожалуйста, помогите мне управлять написанной мной специальной функцией WNPROC.

func main() {

    hwnd := w32.HWND(3736818)
    go SetWindowLongTest(w32.HWND(hwnd))
    time.Sleep(99999 * time.Second)
}


func SetWindowLongTest(hwnd w32.HWND) {
    result, err := win.SetWindowLongPtr(win.HWND(hwnd), win.GWL_WNDPROC, syscall.NewCallback(MyNewWndProc))
    if err != nil {
        fmt.Println("SetWindowLongPtr", err)
    }
    fmt.Println(result)
}



func MyNewWndProc(hwnd w32.HWND, uMsg uint, wParam w32.WPARAM, lParam w32.LPARAM) uintptr {
    fmt.Println(uMsg)
    fmt.Println("myNewWndProc", hwnd)
    return 0
}

  Result: 
    PS C:\Users\Cingozr\go\src> go run .\main.go
    SetWindowLongPtr Access is denied.
    0

Способ 2:

func main() {

    hwnd := w32.HWND(3736818)
    go SetClassLongTest(w32.HWND(hwnd))
    time.Sleep(99999 * time.Second)
}

func SetClassLongTest(hwnd w32.HWND) {
    result, err := w32.SetClassLongPtrW(hwnd, -24, syscall.NewCallback(MyNewWndProc))
    if err != nil {
        fmt.Println("SetClassLongPtrW Err", err)
    }
    fmt.Println("SetClassLongPtrW", result)

}

func MyNewWndProc(hwnd w32.HWND, uMsg uint, wParam w32.WPARAM, lParam w32.LPARAM) uintptr {
    fmt.Println(uMsg)
    fmt.Println("myNewWndProc", hwnd)
    return 0
}

Result:
PS C:\Users\Cingozr\go\src> go run .\main.go
SetClassLongPtrW Err Access is denied.
SetClassLongPtrW 0

1 ответ

Ответ: вы не можете заменить кросс-процесс оконной процедуры на SetWindowLongPtr а также SetClassLongPtr.

Вызов SetWindowLongPtr с GWLP_WNDPROCindex создает подкласс класса окна, используемого для создания окна. Приложение может создавать подклассы системного класса, но не должно создавать подклассы класса окна, созданного другим процессом.

Вызов SetClassLongPtr с GCLP_WNDPROCindex создает подкласс класса окна, который влияет на все окна, впоследствии созданные с помощью этого класса. Приложение может создавать подклассы системного класса, но не должно создавать подклассы класса окна, созданного другим процессом.

Кроме того, параметр hwnd SetWindowLongPtr также имеет ограничения UIPI:

Функция SetWindowLongPtr завершается ошибкой, если процесс, которому принадлежит окно, заданное параметром hWnd, имеет более высокие привилегии в иерархии UIPI, чем процесс, в котором находится вызывающий поток.

Windows XP / 2000: SetWindowLongPtr функция не работает, если окно, заданное параметром HWND не принадлежит к тому же процесс, что и вызывающий поток.

Рекомендуется использовать SetWindowsHookEx, если вы хотите отслеживать оконные сообщения. Вы можете прочитать этот документ: Использование хуков

Вы также можете создать свое собственное окно с тем жеWNDCLASSEX(GetClassLongPtr из целевого окна) и стиль (GetWindowLongPtr из целевого окна).

Или вы уже знаете, что делаете, попробуйте внедрение dll.

Другие вопросы по тегам