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]
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]
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;
}
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.
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;
Dobra spoko ale jak reszta jest dobrze to to i tak nie działa [stuk] ;-(
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
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.
Ok dzięki Marooned
Dzięki LKS
Dzięki Johnny_Bit
Kodzik od LKS działa!!!
[browar]
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ż:-(
poszukaj sobie na google czegos o rejestrach windows bo wiem ze dalo sie to zrobic poprzez rejestr :D
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.
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