Delphi Tips 
-----------------------------

キーワード:デスクトップ

>> Index

09/30 アクティブデスクトップを使って壁紙を変更
08/23 デスクトップのウィンドウのタイトルとハンドルを取得する

最終更新: 9186 日前

0278  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/30 篠田 rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/30 篠田 編集
アクティブデスクトップを使って壁紙を変更

アクティブデスクトップを使うには、IActiveDesktop を使います。
Microsoftが提供しているリファレンスはhttp://msdn.microsoft.com/library/sdkdoc/shellcc/Shell/IFaces/IActiveDesktop/IActiveDesktop.htmにあります。


uses ShlObj, ComObj;

// IActiveDesktop を使って壁紙を変更する
procedure TForm1.Button1Click(Sender: TObject);
var
  hObj : IUnknown;
  ADesktop : IActiveDesktop;
  str : String;
  wstr : PWideChar;
begin
  hObj := CreateComObject(StringToGUID('{75048700-EF1F-11D0-9888-006097DEACF9}'));
  ADesktop := hObj as IActiveDesktop;
  if OpenDialog1.Execute then begin
    wstr := AllocMem(MAX_PATH);
    StringToWideChar(OpenDialog1.FileName, wstr, MAX_PATH);
    ADesktop.SetWallpaper(wstr, 0);
    ADesktop.ApplyChanges(AD_APPLY_ALL);
    FreeMem(wstr);
  end;
end;

ここでActiveDesktopのクラスIDとして {75048700-EF1F-11D0-9888-006097DEACF9} というマジックナンバーが使われていますが、もしかしたら将来Windowsのバージョンが変わるとこの値も変わる可能性があります。
しかし[Delphi-ML:42104]に書かれているように、アクティブデスクトップはWindowsの準(?)標準コンポーネントですので、恐らく問題ないと思います。
一応、\\HKEY_CLASSES_ROOT\CLSID\{75048700-EF1F-11D0-9888-006097DEACF9}\(標準) に "ActiveDesktop" という文字列が登録されているのを見つけることができます。
参照: [Delphi-ML:42096] <Windows>

0214  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/08/23 西坂良幸 rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/08/23 西坂良幸 編集
デスクトップのウィンドウのタイトルとハンドルを取得する


稼働中のウィンドウのタイトルとハンドルを取得するには、
APIのENumWindows関数を使います。
第一パラメータのコールバック関数は、タイトルとハンドル
をどのように処理するかを工夫します。

次の例はListBoxに列挙し、Labelにその数を示します。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
  Buf: array [0..255] of Char;
begin
  // スタイル ビットがセットされているもののみ
  if IsWindowVisible(hwnd) then
    // タイトル バーのテキストをBufにコピー
    if GetWindowText(WH, Buf, 255) <> 0 then
      TListBox(LP).Items.AddObject(Buff, Pointer(hwnd));
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Clear;
  EnumWindows(@CallBackTest, Longint(ListBox1));
  Label1.Caption := IntToStr(ListBox1.Items.Count);
end;

参照: [Delphi-ML:2378] [Delphi-ML:23203] <Windows>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords

Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp