przezroczystość podpisu ikon

0

Jak z poziomu Delphi usunąć tło podpisu ikon na pulpicie w Windows 9x i ME tak jak jest to w winxp?

Z góry TXH [browar]

0

Wersja w C++ - to czyste WinAPI - nie powinno być trudności z przetłumaczeniem.

//
//  THIS CODE, PROGRAM AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
//  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
//  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
//  PARTICULAR PURPOSE.
//

////////////////
//  
//  TransDesk.cpp
//  author: Wei Ke [[email protected]]
//  file created: 5/16/98 3:46:29 PM
//  file last modified: 5/20/98 6:12:21 PM
//
//  Toggles desktop icon text background between transparent and Windows' default.

#include <windows.h>
#include <commctrl.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd = FindWindow("Progman", "Program Manager");
    if ( hwnd != NULL ) {
        hwnd = FindWindowEx(hwnd, NULL, "SHELLDLL_DefView", "");
        if ( hwnd != NULL ) {
            hwnd = FindWindowEx(hwnd, NULL, "SysListView32", "");
            if ( hwnd != NULL ) {
                if ( ListView_GetTextBkColor(hwnd) != CLR_NONE ) {
                    ListView_SetTextBkColor(hwnd, CLR_NONE);
                } else {
                    ListView_SetTextBkColor(hwnd, GetSysColor(COLOR_DESKTOP));
                }
                InvalidateRect(hwnd, NULL, TRUE);
                UpdateWindow(hwnd);
            }
        }
    }

    return 0;
}
0

Przerobiłem to tak:

var
hwnd : THandle;
begin
hwnd :=FindWindow('Progman', 'Program Manager');
if hwnd = 0 then
hwnd := FindWindowEx(hwnd, NULL, 'SHELLDLL_DefView', '');
if hwnd = 0 then
hwnd := FindWindowEx(hwnd, NULL, 'SysListView32', '');
if hwnd = 0 then
if ListView_GetTextBkColor(hwnd) = CLR_NONE then
ListView_SetTextBkColor(hwnd, CLR_NONE)
else
begin
ListView_SetTextBkColor(hwnd, GetSysColor(COLOR_DESKTOP));
InvalidateRect(hwnd, nil, true);
UpdateWindow(hwnd);
end;
end;

Tylko to niestety nie działa?
Mógłbyś to poprawić bo ja nie wiem gdzie jest błąd.

0

bo powinno być rózne od null a ty dałeś = null!

var
hwnd : THandle;
begin
hwnd :=FindWindow('Progman', 'Program Manager');
if hwnd <> 0 then
hwnd := FindWindowEx(hwnd, NULL, 'SHELLDLL_DefView', '');
if hwnd <> 0 then
hwnd := FindWindowEx(hwnd, NULL, 'SysListView32', '');
if hwnd <> 0 then
if ListView_GetTextBkColor(hwnd) = CLR_NONE then
ListView_SetTextBkColor(hwnd, CLR_NONE)
else
begin
ListView_SetTextBkColor(hwnd, GetSysColor(COLOR_DESKTOP));
InvalidateRect(hwnd, nil, true);
UpdateWindow(hwnd);
end;
end;
0

Dobra spoko ale jak reszta jest dobrze to to i tak nie działa [stuk] ;-(

0

Kiedyś znalazłem podobny kod w C++, po przerobieniu wygląda tak:

var
 hwnd : Integer;
begin
   hwnd := FindWindow('ProgMan',nil);
   hwnd := GetWindow(hwnd, GW_CHILD);
   hwnd := GetWindow(hwnd, GW_CHILD);

   if (hwnd <> 0) and (SendMessage(hwnd, LVM_GETTEXTBKCOLOR, 0, 0) <> CLR_NONE) then
   begin
     SendMessage(hwnd, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);
     InvalidateRect(hwnd, nil, TRUE);
     UpdateWindow(hwnd);
   end;
end;

Kod, który podał Marooned powinien wyglądać tak:

var
  hwnd : Integer;
begin
  hwnd := FindWindow('Progman', 'Program Manager');
  if hwnd <> 0 then
  begin
    hwnd := FindWindowEx(hwnd, 0, 'SHELLDLL_DefView', '');
    if hwnd <> 0 then
    begin
      hwnd := FindWindowEx(hwnd, 0, 'SysListView32', '');
      if hwnd <> 0 then
      begin
        if ListView_GetTextBkColor(hwnd) <> CLR_NONE then
          ListView_SetTextBkColor(hwnd, CLR_NONE)
        else
          ListView_SetTextBkColor(hwnd, GetSysColor(COLOR_DESKTOP));
        InvalidateRect(hwnd, nil, true);
        UpdateWindow(hwnd);
      end;
    end;
  end;
end;

W obu przypadkach do sekcji uses należy dopisać moduł commctrl

0

No to .::. coś popieprzyłeś (bez urazy), bo ten mały programik mam w Autostarcie (jak i pod skrótem) i działa wyśmienicie na WinMe.

0

Ok dzięki Marooned
Dzięki LKS
Dzięki Johnny_Bit
Kodzik od LKS działa!!!
[browar]

0

Sorki, że odświeżam tak stary temat, ale problem polega na tym jak zrobić aby ten podpis był <ort>przeźroczysty </ort>przez <ort>całyu </ort>czas a nie tylko podczas działania programu. Jak <ort>wyłącze </ort>program i zrobie <ort>odświerz </ort>to już nie działa :-(
Jest jeszcze jedna ciekawa sprawa wg kodu LKS'a tego drugiego w tym przypadku działa dopiero wtedy jak ekran zostanie zasłoniety przez jakieś okno i ponownie odsłonięty
Wszystko jest ładnie ięknie dopóki nie zrobi sie odśwież:-(

0

poszukaj sobie na google czegos o rejestrach windows bo wiem ze dalo sie to zrobic poprzez rejestr :D

0

poszukaj sobie na google czegos o rejestrach windows bo wiem ze dalo sie to zrobic poprzez rejestr :D

Nie ma to jak błyskotliwa odpowiedź :|.
Miałem kiedyś taki program, który siedział w trayu i utrzymanie przeźroczystości było jednym z jego zadań. Wydaje mi się, że należy założyć hook (na komunikat / funckję ?) i po wykryciu odświeżenia ponownie ustawić kolor.

0

Ja <ort>rozumie </ort>takie rozwiązanie jeśli ktoś lubi mieć odpalone w trayu jakieś programy które nie spełniają żadnychistotnych funkcji. Więc <ort>zapyam </ort>inaczej. Jak to zrobić, aby po wyłączeniu programu nadal podpisy miały <ort>przeźroczyste </ort>tło, nawet po odświeżeniu ekranu? Bez zakładania hooka na system. moze jest w rejestrze to gdzieś zapisane, Jeśli ktoś ma ochotę i win XP i ma akurat ustawione <ort>przeźroczyste </ort>podpisy pd ikonami to bardzo bym prosił o rejestr {spakowany} w postaci pliku *.reg na maila poszukam moze znajdę skoro jest to w win 2k i xp to podejrzewam ze wystarczy dodać odpowiednie wpisy w rejestrze i w win9x też zadziała jak dostenę rejestr z xp(cały) i znajde na pewno dam znać w faq

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