喫茶XRAYトップページ

[スレッド全体
]

[4748] Re3:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/14 (土) 00:14:37 Mr.XRAY
参考までに,IShellUIHelperを使用したコードです.
これは,ダイアログのアイコンがタスクバーに(モードレス)表示されます.
Windows XP + IE6
Vista + IE7
Windows 7 U64 + IE8で表示されます.

ダイアログのハンドルを操作して,タスクバーのアイコンを非表示に
もできますが,クラス名が#32770なのて,ちょっと面倒ですね.
もっとも,タスクバーに非表示にしても,モーダル表示となるわけでは
ありません.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses SHDocVw, ComObj;

{$R *.dfm}

//=============================================================================
//  お気に入りダイアログの表示(タスクバーにアイコン表示あり)
//
//  IShellUIHelperの使用にはusesにSHDocVwが必要
//  CreateComObjectの使用にはusesにComObjが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  UIHelper : IShellUIHelper;
  AURL     : String;
  ATitle   : OleVariant;
begin
  UIHelper := CreateComObject(CLASS_ShellUIHelper) as IShellUIHelper;
  AURL     := 'http://mrxray.on.coocan.jp/';
  ATitle   := '素敵なサイト';

  UIHelper.AddFavorite(AURL, ATitle);
end;

end.


[4749] タスクバーのアイコンの表示制御返信 削除
2011/5/14 (土) 00:26:41 Mr.XRAY
>ダイアログのハンドルを操作して,タスクバーのアイコンを非表示に
>もできますが,クラス名が#32770なのて,ちょっと面倒ですね.


参考までに,メモ帳を起動して,メモ帳のタスクバーのアイコンの
非表示,表示を切り替えるサンプルです.
切り替えの時に,一旦メモ帳自身を非表示にするので,少しチラつきます.
#32770の場合は,環境によっては,他のダイアログを検出してしまう
可能性があるので,工夫が必要です.

また,この方法は,ウィンドウのスタイルをWS_EX_TOOLWINDOWとします.
したがって,キャプションバーの高さが低くなってしまいます.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
    hMainWnd : HWND;
    Before : LongInt;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses ShellAPI;

{$R *.dfm}

//=============================================================================
//  テスト用に操作対象のアプリを起動.ここではメモ帳
//  ShellExecuteの使用にはusesにShellAPIが必要
//============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle, 'open', 'Notepad.exe', nil, nil, SW_SHOW);
end;
//=============================================================================
//  タスクバーのアイコンを非表示にする
//============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  //操作対象のウィンドウハンドルを取得する
  //hMainWnd := Application.Handleなら自分自身
  hMainWnd := FindWindow('notepad', nil);

  if hMainWnd <> 0 then begin
    //スタイル変更等は一度非表示にする
    ShowWindow(hMainWnd, SW_HIDE);

    //前の設定を保存しておく
    Before := SetWindowLong(hMainWnd, GWL_EXSTYLE,
              GetWindowLong(hMainWnd, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

    //Zオーダを変更したくないのでShowWindowではなくSetWindwoPosを使用
    SetWindowPos(hMainWnd, 0, 0, 0, 0, 0,
                 SWP_NOMOVE or HWND_BOTTOM        or
                 SWP_NOSIZE or
                 SWP_SHOWWINDOW);
  end else begin
    ShowMessage('メモ帳が見つかりません');
  end;
end;
//=============================================================================
//  対象アプリのウィンドウのスタイルを元に戻す
//============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
  //操作対象のウィンドウハンドルを取得する
  //hMainWnd := Application.Handleなら自分自身
  hMainWnd := FindWindow('notepad', nil);

  if hMainWnd <> 0 then begin
    //スタイル変更等は一度非表示にする
    ShowWindow(hMainWnd, SW_HIDE);

    SetWindowLong(hMainWnd, GWL_EXSTYLE, Before);
    //SetWindowPosでもいいがHideからShowにするので同じ
    //ここまでは非表示なので表示すれば必ずZオーダトップ
    ShowWindow(hMainWnd, SW_SHOWNORMAL);
  end else begin
    ShowMessage('メモ帳が見つかりません');
  end;
end;

end.


[4751] Re4:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/14 (土) 21:57:19 Mr.XRAY
> 参考までに,IShellUIHelperを使用したコードです.

TEmbeddedWBコンポーネントですと,内部で処理してくれますので,
例えば,以下のようにダイアログを表示できます.

[942_TEmbeddedWBコンポーネント]
http://mrxray.on.coocan.jp/Delphi/plSamples/942_TEmbeddedWB.htm

procedure TForm1.Button1Click(Sender: TObject);
begin
  EmbeddedWB1.AddToFavorites(EmbeddedWB1.LocationURL,
                             EmbeddedWB1.Doc2.title);
end;


あるいは,TFavoritesMenuコンポーネントを配置して,

procedure TForm1.FormCreate(Sender: TObject);
begin
  FavoritesMenu1.CreateMenu;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FavoritesMenu1.AddFavorite(nil);
end;


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82