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