Как я могу управлять окнами приложений, открытых с помощью 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_WNDPROC
index создает подкласс класса окна, используемого для создания окна. Приложение может создавать подклассы системного класса, но не должно создавать подклассы класса окна, созданного другим процессом.Вызов
SetClassLongPtr
сGCLP_WNDPROC
index создает подкласс класса окна, который влияет на все окна, впоследствии созданные с помощью этого класса. Приложение может создавать подклассы системного класса, но не должно создавать подклассы класса окна, созданного другим процессом.
Кроме того, параметр hwnd SetWindowLongPtr также имеет ограничения UIPI:
Функция SetWindowLongPtr завершается ошибкой, если процесс, которому принадлежит окно, заданное параметром hWnd, имеет более высокие привилегии в иерархии UIPI, чем процесс, в котором находится вызывающий поток.
Windows XP / 2000: SetWindowLongPtr функция не работает, если окно, заданное параметром HWND не принадлежит к тому же процесс, что и вызывающий поток.
Рекомендуется использовать SetWindowsHookEx
, если вы хотите отслеживать оконные сообщения. Вы можете прочитать этот документ: Использование хуков
Вы также можете создать свое собственное окно с тем жеWNDCLASSEX
(GetClassLongPtr из целевого окна) и стиль (GetWindowLongPtr из целевого окна).
Или вы уже знаете, что делаете, попробуйте внедрение dll.