2012-11-14 14 views
7

Kullandığım bir tanıtıcıya sahip bir konsol uygulamam varsa;C++: Konsol uygulaması için yeni bir wndProc nasıl ayarlanır?

HWND hWnd = GetConsoleWindow(); 

O zaman nasıl pencere için yeni bir wndProc kurarım?
Ben 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); 
} 

olarak tanımlanan varlık ile

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

kullanarak çalıştı Ama bu işe ve der yok "Hata kodu: 5 - Erişim engellendi" Anlıyorum GetLastError()

üzerinde Bu gibi bir konsol uygulaması değiştirmek için oldukça zor, bir csrss.exe uygulama ve tüm, ama hala denemek istiyorum .. Teşekkürler.

+0

o * * için ne bağlı olarak, (http [Konsolu projesi] bulabilir .net/projects/console /) yararlı. –

+2

Bu ilginç çünkü onunla ilişkili olan 'WNDCLASSEX' 'i kapatabiliyor ve kendi pencerenizden esinlenerek çıkabiliyorsunuz, ama' WNDCLASSEX 'biraz zorlaşıyor. 'GetClassInfoEx' bir modül tanıtıcısına ihtiyaç duyar ve bu tanıtıcıyı almak can sıkıcıdır. 'CreateToolhelp32Snapshot' bile, csrss.exe ile kullanamayacağınızı açıkça belirtir. – chris

cevap

10

birlikte, CSRSS sistem işlemi tarafından barındırılan aslında ve onun WndProc yoktur. Bu, pencereyi alt sınıflara ayıramaz ve kendi WndProc'unuzu işleminize sunamaz.

ilgili bazı okuma: // sourceforge:

+0

Gerçekten "yapamadım" cevabını arıyorum, ama bana bazı ilginç bağlantılar verdiniz, bu yüzden sizi destekledim. İnsanların böyle şeyler yapabildiğini duydum ve nasıl yaptıklarıyla ilgileniyorum. Hızlı bir Google araması yaptım ve şunu buldum: http://www.codeforge.com/read/115608/CsrssHook.c__html - Bu, CSRSS'ye bağlanmak için kullanılan örnek bir kod gibi görünüyor. Sanırım bu yapılabilecek bir kanıt olabilir mi ..? –

+0

Başvuruda bulunduğunuz örnek, kodlama işlemini hedef sürecine uygular, böylece bu işlem için kendi 'WndProc'unuzu sağlayabilirsiniz ... Ancak, sistem işlemi için yeterli izinlere sahipseniz bu durum işe yarayabilir. OpenProcess için ERROR_ACCESS_DENIED '(PROCESS_ALL_ACCESS, ... '. –

+1

Windows 7 +' da konsol penceresine, istemcinin güvenlik bağlamında çalışan conhost.exe tarafından barındırılıyor, yani bu durumda PROCESS_ALL_ACCESS var. – eryksun

0

SetWindowLong'un yerine geçecek olan SetWindowLongPtr, bu işlevi kullanmanız gerekir.

Kendi konsol pencerenizin veya başka bir işlemin WNDPROC'sini değiştirmeye mi çalışıyorsunuz? MSDN Dokümanlar

: izlenim (diğer pencere gibi) o konsol penceresi süreci aittir olan

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

Kendi konsol penceresi başka bir işleme aittir, –

+0

Hans Passant ne dedi. –

İlgili konular