2012-11-14 6 views
7

コンソールアプリケーションを持っていれば、そのように設定できます。C++:コンソールアプリケーション用に新しいwndProcを設定するには?

HWND hWnd = GetConsoleWindow(); 

次に、新しいwndProcをウィンドウに設定するにはどうすればよいですか?
は私が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); 
} 

のように定義されている状態で

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

を使用してみました。しかし、それは仕事と言っていません "エラーコード:5 - アクセスが拒否されました" 私は理解してGetLastError()

にcsrss.exeアプリケーションなので、このようなコンソールアプリケーションを変更するのはかなり難しいですが、私はまだ試してみたいと思います。 ありがとうございました。すべてのSetWindowLong関数の第一は、SetWindowLongPtrに取って代わられる

+0

は、[コンソールプロジェクト](HTTPを見つけることができます.net/projects/console /)が便利です。 –

+2

興味深いのは、あなたがそれに関連する 'WNDCLASSEX'をつかんで、自分のウィンドウをそれに基づいて作ることができると言いたいからですが、' WNDCLASSEX'をつかむことはちょっと難しいです。 'GetClassInfoEx'はモジュールハンドルを必要とし、そのハンドルを取得するのは面倒です。 'CreateToolhelp32Snapshot'でさえ、csrss.exeでそれを使うことができないことがはっきりと述べられています。 – chris

答えて

10

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

いくつかの関連読書:// sourceforgeの:それは*用*何によって

+0

私は本当に "それはできない"答えを探しているわけではありませんが、あなたは私に興味深いリンクをくれました。私は人々がこのようなことをすることができることを聞いたことがあります。私は彼らがどのようにそれをしたかに興味があります。私はすばらしいGoogle検索を行いました。これは次のとおりです:http://www.codeforge.com/read/115608/CsrssHook.c__html - これはCSRSSにフックするためのサンプルコードのようです。私はそれができることを証明する何らかのものだろうと思う..? –

+0

あなたが参照するサンプルは、ターゲットプロセスにコードインジェクションを実装しているので、あなた自身の 'WndProc'をそのプロセス内で提供することができます。しかし、これはシステムプロセスをフックするのに十分なパーミッションがあればうまくいくかもしれません。 'OpenProcess(PROCESS_ALL_ACCESS、...')の 'ERROR_ACCESS_DENIED'を得ることに驚かないでください。 –

+1

Windows 7+では、コンソールウィンドウはconhost.exeによってホストされます。conhost.exeはクライアントのセキュリティコンテキストで実行されます。 'PROCESS_ALL_ACCESS'を持っています。 – eryksun

0

、あなたはその関数を使用する必要があります。

独自のコンソールウィンドウの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.

+4

彼自身のコンソールウィンドウは別のプロセスに属しています –

+0

Hans Passantは言った。 –

関連する問題