диаграммы - нарисовать график c#




Как рисовать графику/текст поверх другого приложения (2)

Нет никаких хороших способов сделать это, но один подход, который может сработать для вас, - это связать приложение, использующее SetWindowsHookEx (...), чтобы добавить GetMsgProc, который нарисовывает ваш оверлей в ответ на сообщения WM_PAINT. Основная идея заключается в том, что вы рисуете свою графику сразу после того, как приложение заканчивает собственный рисунок.

В главном приложении:

....
HMODULE hDllInstance = LoadLibrary("myFavoriteDll");
HOOKPROC pOverlayHook = (HOOKPROC)GetProcAddress(hDllInstance, "OverlayHook");
SetWindowsHookEx(WH_GETMESSAGE, pOverlayHook, hDllInstance, threadId);

Выключить в DLL где-нибудь:

LRESULT CALLBACK OverlayHook(int code, WPARAM wParam, LPARAM lParam)
{
  //Try and be the LAST responder to WM_PAINT messages;
  //Of course, if some other application tries this all bets are off
  LRESULT retCode = CallNextHookEx(NULL, code, wParam, lParam);

  //Per GetMsgProc documentation, don't do anything fancy
  if(code < 0) return retCode;

  //Assumes that target application only draws when WM_PAINT message is
  //removed from input queue.
  if(wParam == PM_NOREMOVE) return retCode;

  MSG* message = (MSG*)lParam;

  //Ignore everything that isn't a paint request
  if(message->message != WM_PAINT) return retCode;

  PAINTSTRUCT psPaint;    

  BeginPaint(message->hwnd, &psPaint);
  //Draw your overlay here
  ...
  EndPaint(message->hwnd, &psPaint);

  return retCode;
}

Это все win32, поэтому ваш код на C # будет p / invoke тяжелым и, соответственно, довольно уродливым. Ваша DLL также должна быть неуправляемой (если вы намерены внедрить другой процесс, чем ваш собственный), что делает это еще более неприятным решением.

Это позволит решить вашу проблему с проблемами z-order и clipping, поскольку вы рендеринга в самом окне. Однако, если приложение, на которое вы нацеливаете, делает какой-либо рисунок за пределами WinProc, отвечающий на WM_PAINT, разваливается; это не совсем необычное явление.

Я хочу улучшить приложение, но нет 3-х стороннего API-интерфейса. Поэтому в основном идея состоит в том, чтобы рисовать графику / текст поверх окон приложений.

Существуют проблемы с z-порядком, отсечением и управлением щелчками мыши либо в приложении, либо в другом приложении.

Каков элегантный способ сделать это?

Пример изображения здесь. Это торговое приложение, в котором мое приложение хочет добавить дополнительную информацию в окна торгового приложения. [URL = http://img104.imageshack.us/my.php?image=windowontop.png][/URL]






graphics