1) Your deskband must implement IOleCommandTarget. When shell call IOleCommandTarget.Exec with DBID_SETWINDOWTHEME you must store theme name in variable WindowThemeSubClass.
2) Open theme (code from my Shell Ace lib):
FToolBarTheme := IntOpenThemeData(Handle, 'TOOLBAR', WindowThemeSubClass)
...
class function TdecShellExplorerForm.IntOpenThemeData(AWnd: HWND; const AClass, ASubClass: UnicodeString): HTHEME;
var
Temp: TForm;
begin
if ASubClass = '' then
Result := OpenThemeData(AWnd, PWideChar(AClass))
else
if IsWindowsVistaOrLater then
begin
Result := OpenThemeData(AWnd, PWideChar(ASubClass + '::' + AClass));
if Result = 0 then
Result := OpenThemeData(AWnd, PWideChar(AClass));
end
else
begin
Temp := TForm.Create(Application);
try
SetWindowTheme(Temp.Handle, PWideChar(ASubClass), nil);
Result := OpenThemeData(Temp.Handle, PWideChar(AClass));
if Result = 0 then
Result := OpenThemeData(AWnd, PWideChar(AClass));
finally
Temp.Free;
end;
end;
end;
XP does not support OpenTheme with parameter like 'SubClass::Class'!
3) Draw button only in cases when mouse over your button or user press your button:
DrawThemeBackground(FToolBarTheme, Canvas.Handle, TP_BUTTON, State, Rec.Rect, nil);
where state is TS_HOT when user mouse over your button or is TS_PRESSED when user press your button.
Result:
Mouse over MS Tablet PC Input panel:
Mouse over my extension: