[WinApi] Wyświetlanie tekstu na pulpicie

Odpowiedz Nowy wątek
GsK
2008-02-16 13:55
GsK

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

Witam.
Mam mały problem z wyświetlaniem tekstu na pulpicie.
Wyświetlam go za pomocą :

 PAIN:
    begin
      InvalidateRect(GetDesktopListViewHandle,@r,true);
      DC := BeginPaint(GetDesktopListViewHandle, PS);
      SetBkMode(DC, TRANSPARENT);
      SetTextColor(DC, RGB(255, 255, 255));
      i:=1;
      case dzien of
      0:  AssignFile(tf, 'plan/pn.pln');
      1:  AssignFile(tf, 'plan/wt.pln');

      2:  AssignFile(tf, 'plan/sr.pln');

      3:  AssignFile(tf, 'plan/cz.pln');

      4:  AssignFile(tf, 'plan/pt.pln');

      end;
      Reset(tf);
      While not eof(tf) do
        begin
          Readln(tf, s);
          i:= i +17;
          TextOut(DC, 1024 - 200, i, Pchar(s), Length(s));
        end;
        CloseFile(tf);
      EndPaint(GetDesktopListViewHandle, PS);
    end;

Mój DLL'ka z hookiem wygląda tak:


  If pcws.hwnd = GetDesktopListViewHandle then
  case pcws.message of
    WM_PAINT:
        PostMessage(FindWindow('Program', nil), PAIN, 0, 0);

No i niby wszystko powinno działać, jednak gdy jakieś okno pokaże się na pulpicie bądź zasłoni częściowo napis, on znika.

Gdyby po zasłonięciu napisu znikał, dałoby się to przeżyć, ale jak np. otworze okienko gg, które jest na drugim końcu ekranu, mój napis nagle znika, czasem pojawia się po kliknięciu na pulpit, czasem sam.
Ogólnie wariuje.
Chciałbym zrobić zwykły napis, który po prostu by tam był, niezależnie od tego co jeszcze jest na pulpicie.
Pomocy !

Pozostało 580 znaków

2008-02-16 14:03

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

0

Takie rzeczy realizuje się własnym oknem, a nie rysowaniem po pulpicie, który system ma prawo odmalować, kiedy mu się żywnie podoba.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

GsK
2008-02-16 14:28
GsK

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

taaa, i w tym jest właśnie problem, nie da się tego w żaden sposób zrobić, żeby działało ?

Formy pokazane w linku, który podałeś są pamięciożerne, a moja aplikacja prawie nic nie zżera.

Edit: Co do Twojej propozycji, miejsce w pamięci jeszcze ujdzie, bardziej natomiast denerwuje mnie to, że niewiem jak usunąć takie okno z menu pod Alt-Tab.

Szukałem wszędzie, ale żadne z podanych rozwiązań nie działa.

Pozostało 580 znaków

2008-02-16 19:20

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

0

Żadna z przedstawionych form, z wyjątkiem ustawienia przezroczystości pikseli z zachowaniem komponentów, nie jest pamięciożerna.

Usunięcie spod ALT+TAB to tylko kwestia ustawienia parametrów stylu okna, ewentualnie okna rodzica.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2008-02-16 19:57

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

Byłbym niezmiernie wdzięczny jeśli mógłbyś podać kodzik.

Pozostało 580 znaków

2008-02-16 20:49

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

0

Szkielet całości okna mógłby być taki:

program Project1;

uses
  Windows, Messages, Graphics, Types;

function WndProc(Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
begin
Result := 0;
case uMsg of
  WM_DESTROY: PostQuitMessage(0);
  else Result := DefWindowProc(Wnd, uMsg, wPar, lPar);
  end;
end;

function CreateBitmap(Width:integer; Height:integer; PixelFormat:TPixelFormat):TBitmap;
begin
result:=TBitmap.Create;
result.Width:=Width;
result.Height:=Height;
result.PixelFormat:=PixelFormat;
end;

procedure DrawLayered(Window:THandle);
var blend:BLENDFUNCTION;
    P:TPoint;
    S:TSize;
    RGBA,RGB,A:TBitmap;
    X,Y:integer;
    RGBAPixel:PRGBQuad;
    RGBPixel:PRGBTriple;
    APixel:PByte;
begin
//Przygotowywanie bitmapy
RGBA := CreateBitmap(100, 100, pf32bit);
RGB := CreateBitmap(100, 100, pf24bit);
A := CreateBitmap(100, 100, pf8bit);
try

  {RYSOWANIE PO KANALE RGB}
  {RYSOWANIE PO KANALE Alpha}

  for Y := RGBA.Height-1 downto 0 do
    begin
    RGBAPixel:=RGBA.ScanLine[y];
    RGBPixel:=RGB.ScanLine[y];
    APixel:=A.ScanLine[y];
    for X := 0 to RGBA.Width-1 do
      begin
      //APixel^:=255-APixel^;
      RGBAPixel.rgbReserved := APixel^;
      RGBAPixel.rgbRed := MulDiv(RGBPixel.rgbtRed, APixel^, 255);
      RGBAPixel.rgbGreen := MulDiv(RGBPixel.rgbtGreen, APixel^, 255);
      RGBAPixel.rgbBlue := MulDiv(RGBPixel.rgbtBlue, APixel^, 255);

      inc(RGBAPixel);
      inc(RGBPixel);
      inc(APixel);
      end;
    end;

//Nakładanie bitmapy
  P.X := 0;
  P.Y := 0;
  S.cx := RGBA.Width;
  S.cy := RGBA.Height;
  blend.BlendOp := AC_SRC_OVER;
  blend.BlendFlags := 0;
  blend.AlphaFormat := AC_SRC_ALPHA;
  blend.SourceConstantAlpha := 255;
  UpdateLayeredWindow(Window, GetDC(0), nil, @S, RGBA.Canvas.Handle, @P, 0, @blend, ULW_ALPHA);
finally
  RGBA.Free;
  RGB.Free;
  A.Free;
  end;
end;

var WindowClass:TWndClass;
    Window:THandle;
    Message:TMsg;
begin
ZeroMemory(@WindowClass, sizeof(WindowClass));
WindowClass.lpszClassName := 'Gadżet';
WindowClass.hCursor:=LoadCursor(0, IDC_ARROW);
WindowClass.lpfnWndProc := @WndProc;
WindowClass.hInstance := hInstance;
WindowClass.hbrBackground := COLOR_WINDOW;

RegisterClass(WindowClass);
Window:=CreateWindowEx(WS_EX_TOOLWINDOW or WS_EX_LAYERED, WindowClass.lpszClassName, 'RSS Gadget', WS_POPUPWINDOW or WS_VISIBLE, 100, 100, 200, 200, GetDesktopWindow(), 0, hInstance, nil);
SetWindowPos(Window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
SetParent(Window, GetDesktopWindow());
DrawLayered(Window);

while GetMessage(Message, 0, 0, 0) do DispatchMessage(Message);

DestroyWindow(Window);
UnregisterClass(WindowClass.lpszClassName, hInstance);
end.

<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

GsK
2008-02-16 21:51
GsK

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

Hmm, teraz podałeś mi szkielet programu w WinApi, ale szczerze mówiąc niewiele rozumiem z tego kodu, więc również nie wiem jak np. coś tam napisać.

Nie ma jakiegoś kodu po prostu na usunięcie programu (z formami) z alt-tab ?
Bo coś mi się wydaje, że zanim zrozumiem kod, który mi podałeś minie sporo czasu.
Ja osobiście myślałem nad 3 sposobami wyświetlenia tekstu na pulpicie:

1.Poprzez to co napisałem wyżej (czyli obsługa WM_PAIN);
2.Stworzenie 'STATIC'a na pulpicie ( jak na razie najlepsze, aczkolwiek przeszkadza to, że ma tło);
3.Stworzenie zwykłej formy przyklejonej do pulpitu. (przeszkadza obecność programu w alt-tab);

No i teraz mam 4 rozwiązanie ;) Zrozumienie Twojego kodu (najprawdopodobniej się z tym pomęczę).

W każdym razie dziękuje, w pewnym sensie mi pomogłeś.

Pozostało 580 znaków

2008-02-16 22:02

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

0

Zmień styl okna na WS_EX_TOOLWINDOW, jak w powyższym przykładzie.

To co dałem powyżej, to pełna, działająca aplikacja pokazująca coś (na przykład tekst - miejsce rysowania oznaczyłem komentarzem) na pulpicie - jeszcze z uwzględnioną przezroczystością, bez rysowania po samym oknie pulpitu.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

GsK
2008-02-16 23:41
GsK

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

Dobrze, więc nie zagłębiając się w tajemnice Twojego kodu, mógłbyś mi tylko powiedzieć gdzie zmienić tło na czarne ? Albo jakby się dało zrobić tak aby tło było przezroczyste, a napis nie.

na razie wygląda to tak:

try

  rgb.Canvas.Font.Color:= clRed;
  rgb.Canvas.TextOut(2, 2, 'aaaaaaa');

  for Y := RGBA.Height-1 downto 0 do
{............}

Pozostało 580 znaków

2008-02-16 23:44

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

0

Musisz rysować jednocześnie po obu warstwach: RGB to rysunek, A to przezroczystość. Chcesz tło czarne, zmieniasz na RGB. Chcesz pokazać nieprzezroczysty napis na przezroczystym tle, na RGB rysujesz napis w wybranym kolorze, A wypełniasz na czarno i na biało rysujesz napis - czyli w miejscu napisu forma nie będzie przezroczysta.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

GsK
2008-02-17 00:50
GsK

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

Wielkie dzięki !
Naprawdę bardzo mi pomogłeś.
jeszcze raz dzięki :)

Edit:
Mam jeszcze jedno mały pytanko:
Jak wysłać jakiś komunikat do tego programu ?

w dll'ce daje

PostMessage(FindWindow('Program', nil), WPRAWO, 0, 0);

Oczywiście zmieniłem nazwę pliku, class name.

w programie mam:

WPRAWO:
      messagebox(getdesktoplistviewhandle, 'aa', 'aa', mb_iconinformation);

I nie działa.
Natomiast jak w dll'ce zaraz przed PostMessage dam messagebox(...) to się wyświetla, a więc problem musi być z dostarczaniem komunikatu.
O co może chodzić ?

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0