2012-11-14 20 views
7

Nếu tôi có ứng dụng bảng điều khiển có tay cầm để thiết lập như vậy;C++: Cách đặt wndProc mới cho ứng dụng bảng điều khiển?

HWND hWnd = GetConsoleWindow(); 

Sau đó, làm cách nào để thiết lập wndProc mới cho cửa sổ?
tôi đã cố gắng sử dụng

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

Với conProc được định nghĩa là

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

Nhưng nó không hoạt động và nói "Error code: 5 - Truy cập bị từ chối" trên GetLastError()

Tôi hiểu rằng nó khá khó khăn để sửa đổi các ứng dụng giao diện điều khiển như thế này, vì nó là một ứng dụng csrss.exe và tất cả, nhưng tôi vẫn muốn thử .. Cảm ơn.

+0

Tùy thuộc vào những gì đó là * cho *, bạn có thể tìm ra [dự án điều khiển] (http: // sourceforge .net/projects/console /) hữu ích. –

+2

Thật thú vị vì tôi định nói rằng bạn có thể lấy 'WNDCLASSEX' được liên kết với nó và làm cho cửa sổ của riêng bạn dựa trên cái đó, nhưng hóa ra việc lấy' WNDCLASSEX' hơi khó. 'GetClassInfoEx' cần một trình xử lý mô-đun và việc xử lý đó gây phiền toái. Ngay cả 'CreateToolhelp32Snapshot' rõ ràng nói rằng bạn không thể sử dụng nó với csrss.exe. – chris

Trả lời

10

Trong khi ấn tượng là giao diện điều khiển cửa sổ thuộc về quá trình của bạn (như cửa sổ khác), nó là trong thực tế được tổ chức bởi quá trình hệ thống CSRSS và WndProc của nó là ở đó. Điều này làm cho bạn không thể phân lớp cửa sổ và cung cấp WndProc của riêng bạn trong quá trình của bạn.

Một số đọc liên quan:

+0

Tôi không thực sự tìm kiếm một câu trả lời "nó không thể được thực hiện", nhưng bạn đã cho tôi một số liên kết thú vị, vì vậy tôi upvoted bạn. Tôi đã nghe nói về những người có thể làm những việc như thế này, và tôi quan tâm đến cách họ đã làm điều đó. Tôi đã tìm kiếm nhanh trên Google và tôi đã tìm thấy điều này: http://www.codeforge.com/read/115608/CsrssHook.c__html - Dường như đây là mã mẫu được sử dụng để móc vào CSRSS. Tôi đoán đó sẽ là một số loại bằng chứng rằng nó có thể được thực hiện ..? –

+0

Mẫu bạn gọi để thực hiện việc tiêm mã vào quy trình đích, để bạn có thể cung cấp 'WndProc' của riêng bạn trong quá trình đó ... Điều này có thể làm việc nếu bạn có đủ quyền để móc quá trình hệ thống. Đừng ngạc nhiên khi nhận được 'ERROR_ACCESS_DENIED' cho' OpenProcess (PROCESS_ALL_ACCESS, ... '. –

+1

Trong Windows 7+ cửa sổ giao diện điều khiển được lưu trữ bởi conhost.exe, chạy trong ngữ cảnh bảo mật của máy khách, ví dụ trong trường hợp này bạn có 'PROCESS_ALL_ACCESS'. – eryksun

0

Trước hết SetWindowLong được thay thế bởi SetWindowLongPtr, bạn nên sử dụng chức năng đó.

Bạn đang cố gắng thay đổi WNDPROC của cửa sổ bảng điều khiển của riêng bạn hoặc một quy trình khác?

Từ các tài liệu 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

Cửa sổ bảng điều khiển của riêng anh thuộc về một quy trình khác, –

+0

Điều Hans Passant nói. –

Các vấn đề liên quan