Как создать STATIC контрол в чужом окне?
От: _Cool-  
Дата: 25.02.09 07:35
Оценка:
Пытаюсь вывести текст в чужом окне, получаю его HWND, создаю окно с ним в качестве родителя. Оно появляется, но постоянно затирается, то появится, то исчезнет. Как нужно правильно делать?


void main()
{
..............
    GetClassInfo(GetModuleHandle(NULL), L"STATIC", &wcls);
    CopyMemory(&wcl, &wcls, sizeof(WNDCLASS));
    wcl.hInstance       = GetModuleHandle(NULL);
    wcl.lpszClassName   = L"FTInfoWin";
    wcl.lpfnWndProc     = (WNDPROC)WinDialogProc;
    wcl.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
    RegisterClass(&wcl);
 
    HWND hwnd = CreateWindow(   L"FTInfoWin", 
                                L"",
                                WS_CHILD,
                                posx, posy,
                                15, 15,
                                parent->HWnd(),           // HWND чужого окна
                                (HMENU)"", 
                                GetModuleHandle(NULL),
                                NULL);
    if (hwnd)
    {
        ShowWindow(hwnd,SW_SHOW);
        UpdateWindow(hwnd);
        SetWindowPos(hwnd, HWND_TOPMOST, posx, posy, 15, 15, SWP_SHOWWINDOW);
        }
...............
}
 
 
int CFTChildWindow::OnDraw()
{
    PAINTSTRUCT ps;
    HDC hDC = GetDC(hWnd);
    SetBkColor(hDC, RGB(0,0,0));
    SetTextColor(hDC, RGB(0,255,0));
    wchar_t text[255];
    if (_itow(iValue, text, 10))
        TextOut(hDC, 0,0, text, wcslen(text));
    return 1;
}
 
LRESULT CALLBACK WinDialogProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch (msg)
    {
        case WM_PAINT:
            {
            LRESULT r = DefWindowProc(hWnd,msg,wParam,lParam);
            if (windows.find(hWnd)!=windows.end())
            {
                windows[hWnd]->OnDraw();              // рисуем наш контрол
            }
            return r;
            }
        break;
         }
}
Re: Как создать STATIC контрол в чужом окне?
От: DarkTranquillity  
Дата: 25.02.09 09:24
Оценка:
Здравствуйте, _Cool-, Вы писали:

_C>Пытаюсь вывести текст в чужом окне, получаю его HWND, создаю окно с ним в качестве родителя. Оно появляется, но постоянно затирается, то появится, то исчезнет. Как нужно правильно делать?



_C>
_C>void main()
_C>{
_C>..............
_C>    GetClassInfo(GetModuleHandle(NULL), L"STATIC", &wcls);
_C>    CopyMemory(&wcl, &wcls, sizeof(WNDCLASS));
_C>    wcl.hInstance       = GetModuleHandle(NULL);
_C>    wcl.lpszClassName   = L"FTInfoWin";
_C>    wcl.lpfnWndProc     = (WNDPROC)WinDialogProc;
_C>    wcl.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
_C>    RegisterClass(&wcl);
 
_C>    HWND hwnd = CreateWindow(   L"FTInfoWin", 
_C>                                L"",
_C>                                WS_CHILD,
_C>                                posx, posy,
_C>                                15, 15,
_C>                                parent->HWnd(),           // HWND чужого окна
_C>                                (HMENU)"", 
_C>                                GetModuleHandle(NULL),
_C>                                NULL);
_C>    if (hwnd)
_C>    {
_C>        ShowWindow(hwnd,SW_SHOW);
_C>        UpdateWindow(hwnd);
_C>        SetWindowPos(hwnd, HWND_TOPMOST, posx, posy, 15, 15, SWP_SHOWWINDOW);
_C>        }
_C>...............
_C>}
 
 
_C>int CFTChildWindow::OnDraw()
_C>{
_C>    PAINTSTRUCT ps;
_C>    HDC hDC = GetDC(hWnd);
_C>    SetBkColor(hDC, RGB(0,0,0));
_C>    SetTextColor(hDC, RGB(0,255,0));
_C>    wchar_t text[255];
_C>    if (_itow(iValue, text, 10))
_C>        TextOut(hDC, 0,0, text, wcslen(text));
_C>    return 1;
_C>}
 
_C>LRESULT CALLBACK WinDialogProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
_C>{
_C>    switch (msg)
_C>    {
_C>        case WM_PAINT:
_C>            {
_C>            LRESULT r = DefWindowProc(hWnd,msg,wParam,lParam);
_C>            if (windows.find(hWnd)!=windows.end())
_C>            {
_C>                windows[hWnd]->OnDraw();              // рисуем наш контрол
_C>            }
_C>            return r;
_C>            }
_C>        break;
_C>         }
_C>}
_C>



Как нужно правильно делать?


Не писать связанные с такими вещами штуки на API.
Re: Как создать STATIC контрол в чужом окне?
От: SaZ  
Дата: 25.02.09 09:27
Оценка:
Здравствуйте, _Cool-, Вы писали:

_C>Пытаюсь вывести текст в чужом окне, получаю его HWND, создаю окно с ним в качестве родителя. Оно появляется, но постоянно затирается, то появится, то исчезнет. Как нужно правильно делать?


Почитать про сабклассинг?
Re[2]: Как создать STATIC контрол в чужом окне?
От: _Cool-  
Дата: 25.02.09 09:45
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, _Cool-, Вы писали:


_C>>Пытаюсь вывести текст в чужом окне, получаю его HWND, создаю окно с ним в качестве родителя. Оно появляется, но постоянно затирается, то появится, то исчезнет. Как нужно правильно делать?


SaZ>Почитать про сабклассинг?


Вы про это?
SetWindowSubclass
"MSDN: You cannot use the subclassing helper functions to subclass a window across threads."
SetWindowLong
"MSDN: The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread."
Может стоит самому почитать прежде чем советовать?
Re[2]: Как создать STATIC контрол в чужом окне?
От: _Cool-  
Дата: 25.02.09 09:47
Оценка:
Здравствуйте, DarkTranquillity, Вы писали:
DT>Не писать связанные с такими вещами штуки на API.

Спасибо за мудрый совет, считайте меня извращенцем
Re[3]: Как создать STATIC контрол в чужом окне?
От: SaZ  
Дата: 25.02.09 13:06
Оценка:
Здравствуйте, _Cool-, Вы писали:

_C>Здравствуйте, SaZ, Вы писали:


SaZ>>Здравствуйте, _Cool-, Вы писали:


_C>>>Пытаюсь вывести текст в чужом окне, получаю его HWND, создаю окно с ним в качестве родителя. Оно появляется, но постоянно затирается, то появится, то исчезнет. Как нужно правильно делать?


SaZ>>Почитать про сабклассинг?


_C>Вы про это?

_C>SetWindowSubclass
_C>"MSDN: You cannot use the subclassing helper functions to subclass a window across threads."
_C>SetWindowLong
_C>"MSDN: The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread."
_C>Может стоит самому почитать прежде чем советовать?

Ну для начала стоит определиться, в каком процессе окно.
Re[4]: Как создать STATIC контрол в чужом окне?
От: Аноним  
Дата: 25.02.09 16:13
Оценка:
SaZ>>>Почитать про сабклассинг?

_C>>Вы про это?

_C>>SetWindowSubclass
_C>>"MSDN: You cannot use the subclassing helper functions to subclass a window across threads."
_C>>SetWindowLong
_C>>"MSDN: The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread."
_C>>Может стоит самому почитать прежде чем советовать?

SaZ>Ну для начала стоит определиться, в каком процессе окно.


После этого — к Рихтеру, методика "DLL injection"
Re[5]: Как создать STATIC контрол в чужом окне?
От: _Cool-  
Дата: 26.02.09 06:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>После этого — к Рихтеру, методика "DLL injection"


До последнего не хотел инъекции юзать, но похоже всетаки придется...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.