Рисование в окне другого приложения
От: 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));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.