1

実際のウィンドウをサブクラス化して、サイズがいつ変更されたかを検出したいと考えています。

これは、CallWindowProcW と SetWindowLongW を使用してサブクラス化しようとした関連コードですが、ウィンドウを最大化してもメッセージが表示されないため、これらのプロシージャのいくつかを間違って設定したと思われます。どうやってするの?

var oldWindowProc uintptr

func windowProc(hwnd syscall.Handle, msg uint32, wparam, lparam uintptr) (rc uintptr) {
    switch msg {
    case WM_SIZE:
        fmt.Println("Size")
        if wparam == SIZE_MAXIMIZED {
            fmt.Println("Changed!")
        }
    default:
        return CallWindowProcW(oldWindowProc, hwnd, msg, wparam, lparam)
    }
    return 0
}

func main() {
    oldWindowProc, _ = SetWindowLongW(syscall.Stdin, GWLP_WNDPROC,
        syscall.NewCallback(windowProc))

    for {

    }
}
4

2 に答える 2

2

winapiについてはよくわかりませんが、あなたのコードはラッパーの例によく似ているようですgo-winapi

そして、そのラッパーライブラリを使用すると、この変更されたバージョンは私にとってはうまくいくようです:

(完全なコード)

をちょきちょきと切る

// window procedure
func WndProc(hwnd winapi.HWND, msg uint32, wparam uintptr, lparam uintptr) uintptr {
    switch msg {
    case winapi.WM_SIZE:
        if wparam == SIZE_MAXIMIZED {
            fmt.Println("Changed!")
        }
    }
    // call original procedure
    return winapi.CallWindowProc(uintptr(oldWndProc), hwnd, msg, wparam, lparam)
}

そのラッパー lib を見て、それを行うより直接的な方法を導き出すことができると確信しています。

于 2012-09-13T22:09:12.870 に答える
0

あなたのコードは言う:

SetWindowLongW(syscall.Stdin, GWLP_WNDPROC, syscall.NewCallback(windowProc))

しかし、なぜ syscall.Stdin を SetWindowLongW に渡しているのでしょうか? 代わりにウィンドウハンドルを提供すると思いませんか?

アレックス

于 2012-09-14T00:52:30.957 に答える