Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Установить оконную процедуру консольному окну


Автор: ZufuS 21.7.2007, 18:19
Код

#include <windows.h>

HWND GetConsoleHwnd();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int main()
{
    SetWindowLong(GetConsoleHwnd(), GWL_WNDPROC, (long)WndProc);
    MSG msg;
    HACCEL hAccelTable; // что сюда надо присвоить?
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_LBUTTONDOWN:
        SetConsoleTitle("CLICK");
    }
    return 0;
}    

HWND GetConsoleHwnd()
{
    #define MY_BUFSIZE 1024
    HWND hwndFound;
    char pszNewWindowTitle[MY_BUFSIZE];
    char pszOldWindowTitle[MY_BUFSIZE];
    GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
    wsprintf(pszNewWindowTitle,"%d/%d",
            GetTickCount(),
            GetCurrentProcessId());
    SetConsoleTitle(pszNewWindowTitle);
    Sleep(40);
    hwndFound=FindWindow(NULL, pszNewWindowTitle);
    SetConsoleTitle(pszOldWindowTitle);
    return(hwndFound);
}

где ошибка?

Автор: Romikgy 21.7.2007, 19:12
Цитата(ZufuS @  21.7.2007,  17:19 Найти цитируемый пост)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_LBUTTONDOWN:
        SetConsoleTitle("CLICK");
    }
    return 0;
}  

а че придыдущию ф-ию не вызываешь?

Автор: ZufuS 21.7.2007, 19:49
которую?

Автор: jonie 21.7.2007, 19:51
которую заменяешь :
Код

 SetWindowLong(GetConsoleHwnd(), GWL_WNDPROC, (long)WndProc);

сохрани возрат ее и вызывай "родительский" код юзая CallWindowProc()

Автор: ZufuS 21.7.2007, 20:18
Код

#include <windows.h>

HWND GetConsoleHwnd();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

long swl;

int main()
{
    swl = SetWindowLong(GetConsoleHwnd(), GWL_WNDPROC, (long)WndProc);
    MSG msg;
    HACCEL hAccelTable;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    CallWindowProc( swl, GetConsoleHwnd(), message, wParam, lParam );
    switch (message) 
    {
    case WM_LBUTTONDOWN:
        SetConsoleTitle("CLICK");
    }
    return 0;
}    

HWND GetConsoleHwnd()
{
    #define MY_BUFSIZE 1024
    HWND hwndFound;
    char pszNewWindowTitle[MY_BUFSIZE];
    char pszOldWindowTitle[MY_BUFSIZE];
    GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
    wsprintf(pszNewWindowTitle,"%d/%d",
            GetTickCount(),
            GetCurrentProcessId());
    SetConsoleTitle(pszNewWindowTitle);
    Sleep(40);
    hwndFound=FindWindow(NULL, pszNewWindowTitle);
    SetConsoleTitle(pszOldWindowTitle);
    return(hwndFound);
}

так чтоли?

error C2664: 'CallWindowProcA' : cannot convert parameter 1 from 'long' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

Автор: jonie 21.7.2007, 22:11
потому что пассатижи....
Код

....
WNDPROC swl;
...
swl = (WNDPROC)SetWindowLong(GetConsoleHwnd(), GWL_WNDPROC, (long)WndProc);
....
.......

Автор: ZufuS 22.7.2007, 00:01
не помогло

Автор: 586 22.7.2007, 12:43
и не поможет. Нельзя сабклассить консоль.
GetLastError() после SetWindowLong возвращает 5 - отказано в доступе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)