11

ハンドル付きのコンソールアプリケーションがある場合は、そのように設定します。

HWND hWnd = GetConsoleWindow();

次に、ウィンドウに新しいwndProcを設定するにはどうすればよいですか?
使ってみました

SetWindowLong(hWnd, GWL_WNDPROC, (LONG)conProc);

conProcは次のように定義されています

LRESULT CALLBACK conProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_NCHITTEST:
            return HTCAPTION;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam );
}

しかし、それは機能せず、「エラーコード:5-アクセスが拒否されました」と表示されますGetLastError()

このようなコンソールアプリケーションはcsrss.exeアプリケーションであるため、変更するのはかなり難しいことを理解していますが、それでも試してみたいと思います。ありがとうございます。

4

2 に答える 2

16

コンソール ウィンドウは (他のウィンドウと同様に) プロセスに属しているように見えますが、実際にはCSRSSシステム プロセスによってホストされており、その WndProc がそこにあります。これにより、ウィンドウをサブクラス化し、プロセス内に独自の WndProc を提供することができなくなります。

関連する読書:

于 2012-11-18T09:27:00.043 に答える
0

まず、SetWindowLong は SetWindowLongPtr に取って代わられているため、その関数を使用する必要があります。

自分のコンソール ウィンドウまたは別のプロセスの WNDPROC を変更しようとしていますか?

MSDN ドキュメントから:

GWL_WNDPROC -4 Sets a new address for the window procedure. You cannot change this attribute if the window does not belong to the same process as the calling thread.

于 2012-11-14T01:34:18.583 に答える