Рисование в окне другого приложения
От: ShootNik  
Дата: 28.10.02 13:41
Оценка:
Помогите нарисовать две горизонтальные линии в окне другого приложения да еще работующего в полноэкранном режиме. В окно идет вывод данных ввиде кадров с тюнера при WM_TIMER, есть какой либо сайт на эту тему либо кто прошел это.

Один из способов который я попробовал реализовать:
С помощью VC++ созданно обычное оконное приложение "WinTimer" без MFC, в оконной функции:
case WM_TIMER:
{
HBRUSH brush, old;
RECT rt;

hdc = GetDC(hWnd);
brush = CreateSolidBrush(RGB(rand() % 255, rand() % 255, rand() % 255));
old = (HBRUSH)SelectObject(hdc, brush);
GetClientRect(hWnd, &rt);
Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom);
SelectObject(hdc, old);
ReleaseDC(hWnd, hdc);
DeleteDC(hdc);
}

dll.h
#define HOOK_API __declspec(dllexport)

//////////////////////////////////////////////////////////////////////
// Глобальные переменные
static HINSTANCE hLib = 0;
static HHOOK hookTimer = 0;
static HWND hwndProg = 0;

//////////////////////////////////////////////////////////////////////
// Экспортируемые функции
extern "C"
{
HOOK_API BOOL InstallHook(HWND hWnd, DWORD dwThrd);
HOOK_API BOOL UninstallHook(void);
}

//////////////////////////////////////////////////////////////////////
// Внутренние функции
LRESULT CALLBACK TimerHook(int nCode, WPARAM wParam, LPARAM lParam);

dll.cpp

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
hLib = (HINSTANCE)hModule;
return TRUE;
}

HOOK_API BOOL InstallHook(HWND hWnd, DWORD dwThrd)
{
hwndProg = hWnd;
hookTimer = SetWindowsHookEx(WH_GETMESSAGE, &TimerHook, hLib, dwThrd);
return TRUE;

}

HOOK_API BOOL UninstallHook(void)
{
UnhookWindowsHookEx(hookTimer);
return TRUE;
}

LRESULT CALLBACK TimerHook(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
return CallNextHookEx(hookTimer, nCode, wParam, lParam);

PMSG pMsg = (PMSG)lParam;
if(pMsg->message == WM_TIMER)
{
// Это сообщение появляется
MessageBox(hwndProg, "WH_GETMESSAGE", "Message", MB_OK);

// А вот это не рисуется!!!!!!!!!!!!
HDC hdc = GetDC(hwndTimer);
// Далее что то рисую
ReleaseDC(hwndTimer, hdc);
DeleteDC(hdc);
}

return CallNextHookEx(hookTimer, nCode, wParam, lParam);
}

dll.dll линкуется неявно с запускающей программой

#define CLASS_NAME "WinTimer"
HWND hWnd=::FindWindow(TEXT(CLASS_NAME),NULL);
if (hWnd)
InstallHook(hWnd, GetWindowThreadProcessId(hWnd, 0));
Re: Рисование в окне другого приложения
От: PSP Беларусь  
Дата: 28.10.02 18:55
Оценка:
Здравствуйте ShootNik, Вы писали:

SN>Помогите нарисовать две горизонтальные линии в окне другого приложения да еще работующего в полноэкранном режиме. В окно идет вывод данных ввиде кадров с тюнера при WM_TIMER, есть какой либо сайт на эту тему либо кто прошел это.


Посмотрел твой код.

Оно и не должно рисоваться.

Перед прорисовкой попробуй вызывать InvaldateRect.
Всегда Ваш, PSP.
Re[2]: Рисование в окне другого приложения
От: ShootNik  
Дата: 29.10.02 07:22
Оценка:
Здравствуйте PSP, Вы писали:

PSP>Посмотрел твой код.


PSP>Оно и не должно рисоваться.


PSP>Перед прорисовкой попробуй вызывать InvaldateRect.


Я понял в чем дело, у меня глобальные данные в DLL инициализируются в начале нулем, и таковыми всегда остаются, несмотря на то что:

#pragma data_seg("JOKER")
HINSTANCE hLib = 0;
hookTimer = 0;
HWND hwndProg = 0;
#pragma data_seg()

#pragma comment(linker, "/SECTION:JOKER, RWS")
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.