Добрый день. Создаю кучу дочерних окошек: ... // Габариты и координаты - реальные hWnd = CreateWindowEx (0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, 20, 20, hWndParent, NULL, hInst, 0); ... // Сабклассинг SetWindowLong (hWnd, GWL_WNDPROC, WndProc); ... Теперь обработчик сообщений дочерних окошек: ... // hWnd - это параметр ф-ии WndProc // Не работает, всегда возвращает ноль, GetLastError() возвращает 1413 - INVALID_INDEX SetWindowLong (hWnd, GWL_USERDATA, 1); ... Что я делаю неправильно?
n0name Это про фразу что ли? Так она относится к "the following values", то есть DWL_*, но не к GWL_USERDATA. da-007 Там же (описание SetWindowLong) другая полезная фраза есть: Класс окна "STATIC" регистрирует система, и при регистрации там, видимо, не резервируется дополнительная память под GWL_USERDATA (действительно, зачем static'у user data?) Так что записать туда что-нибудь не удастся.
Действительно. Но вот ещё одна цитата (http://blogs.msdn.com/oldnewthing/archive/2005/03/03/384285.aspx): Этими значениями должен распоряжаться код "внутренностей" класса (aka оригинальная оконная процедура) (условно говоря, тот же COMBOBOX имеет полное право хранить там указатель на какие-то свои внутренние данные, и если кто-то посторонний нагло перезаписывает этот указатель, поведение оконной процедуры COMBOBOX'а непредсказуемо). Ну а в случае с системным классом STATIC, которому это поле не нужно, возможно, для экономии памяти просто не выделяется полная версия структуры.
А ты пробовал проверять после значение с помощью GetWindowLong(hWnd, GWL_USERDATA) ? Если ты не теряешь хендл hWnd на полпути, то все обязано работать. P.S. Для диалогов помимо GWL_USERDATA ещё существует DWL_USER (для любых окон - GWL_USERDATA присутствует всегда).
diamond ?? Что помешало проверить на живом статике до того, как озвучить эти нелепые фантазии ? Вот он, статик без мистики: Код (Text): .data _static db "static",0 .data? .code SubProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .if uMsg==WM_PAINT invoke GetWindowLong,hWnd,GWL_USERDATA invoke CallWindowProc,eax,hWnd,uMsg,wParam,lParam .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam .endif ret SubProc endp SubClass proc hWnd:HWND,lpp:DWORD invoke SetWindowLong,hWnd,GWL_WNDPROC,lpp invoke SetWindowLong,hWnd,GWL_USERDATA,eax invoke GetClassLong,hWnd,GCL_STYLE and eax,not CS_PARENTDC push eax invoke SetClassLong,hWnd,GCL_STYLE,eax invoke SetWindowLong,hWnd,GWL_EXSTYLE,WS_EX_LAYERED OR WS_EX_CLIENTEDGE invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE OR SWP_NOSIZE OR SWP_FRAMECHANGED invoke SetLayeredWindowAttributes,hWnd,0,180,LWA_ALPHA pop eax or eax,CS_PARENTDC invoke SetClassLong,hWnd,GCL_STYLE,eax mov eax,hWnd ret SubClass endp start: invoke GetModuleHandle,0 invoke CreateWindowEx,0,offset _static,offset _static,WS_OVERLAPPEDWINDOW OR WS_VISIBLE,20,20,300,200,0,0,eax,0 invoke SubClass,eax,addr SubProc invoke MessageBox,0,offset _static,0,MB_TOPMOST invoke ExitProcess,eax end start