タスクバーから隠す


テレサ  2008-12-20 04:04:45  No: 32942

スクリーンキーボードをタスクバーから非表示にできないかと考えております
検索して以下のソースを発見したのですが、うまく隠せなかったので四苦八苦しております
  HW := FindWindow(nil,'スクリーン キーボード');
  SetWindowLong(HD, GWL_EXSTYLE, 
        GetWindowLong(Application.Handle, GWL_EXSTYLE) or                    WS_EX_TOOLWINDOW);

何か良い方法はないでしょうか?


みんみん  2008-12-20 07:48:08  No: 32943

HDは何の変数ですか?(HWの転記ミス?)

FindWindowで取得したウィンドウハンドルを、
以後の関数2つに渡していないのが原因では?


たいみんぐ  2008-12-20 17:22:37  No: 32944

「スクリーンキーボード」が自前のアプリなら、
フォーム作成時にスタイル変更すれば隠せるよ。


Mr.XRAY  URL  2008-12-20 18:56:10  No: 32945

提示したコードは,アプリケーションのアイコンをタスクバーに非表示する
時に使用しますよね.
これは,プロジェクトソースに記述していると思います.
つまりアプリケーションの作成時に行っているわけです.
実行時,つまり動的にスタイルを変更する場合は,そのままではできません.
一度,ウィンドウを非表示にします.

以下はメモ帳の場合です.
その対象となるスクリーンキーボードでうまくいくかどうかは分かりません.
試してみる価値はあると思います.
動作確認は, Windows XP(SP2) + Delphi 7 Proです.

それと,みんみんさんも指摘していますが,変数が変です.
コードを提示する時は,できるだけコピペしましょうね.
一度エディタで発言内容を書いてからアップするといいです.
(私の場合,それでも誤字脱字がありますけどね ^^; )

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
                   SWP_NOSIZE or
                   SWP_NOZORDER);
    end else begin
      ShowMessage('メモ帳が見つかりません');
    end;
end;
//=============================================================================
//  対象アプリのウィンドウのスタイルを元に戻す
//============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
    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.


Mr.XRAY  URL  2008-12-20 19:06:56  No: 32946

もう1つ,念のため,ご自分の開発環境を書くのも質問の際は常識だと考えてください.
今回はどうかは分かりませんが,問題によっては,環境によって動作したり
しなかっりする場合があります.

ちょっと前のスレッドでFusaさんが教えて下さったリンクを再掲しておきます.

DOBON.NETプログラミング道掲示板 書き込みのルールについて
http://dobon.net/vb/bbs/index.html#manners


Mr.XRAY  2008-12-20 20:04:35  No: 32947

ゴメンなさい.Botton2Clickがおかしいですね.
SetWindowPosでSWP_SHOWWINDOWを追加してください.
それと,非表示から表示にするのでZオーダは常にトップですね.


Mr.XRAY  URL  2008-12-22 09:05:20  No: 32948

>その対象となるスクリーンキーボードでうまくいくかどうかは分かりません.

例えば,
【質問】
 テレサという方の作成したアプリを起動すると,自分のアプリがタスクバーから
 消えてしまいます.どうしたら,表示するようにできるでしょうか.
 
 というのがあったとします.
これを実現するために,以下のようにサブクラス化で対応することもできます.
(別にサブクラス化でなくてもいいのですが.他のいい方法があるかも知れません)

つまり,このような対応をしている場合は,先に提示したコードではできない
ということです.

Zオーダなんかもちょっと似たところがあります.
自分のアプリをどうしても,常に最前面に表示したい.
他のアプリの開発者も,どうしても自分のアプリを常に最前面に表示したい.
こういう場合どうなるんでしょうね.

unit TaskBarTest02Unit;

interface

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

type
  TTaskBarTest02Form = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    dwLong : Integer;
    OriginalProc : TWndMethod;
    procedure SubClassProc(var Message: TMessage);
  public
    { Public 宣言 }

  end;

var
  TaskBarTest02Form: TTaskBarTest02Form;

implementation

{$R *.dfm}

procedure TTaskBarTest02Form.SubClassProc(var Message: TMessage);
begin
    //WM_ACTIVATE時だけメッセージを処理
    if Message.Msg =WM_ACTIVATE then begin
      SetWindowLong(Application.Handle,GWL_EXSTYLE,dwLong);
    end;
    //元のWindowProcを実行
    OriginalProc( Message );
end;

procedure TTaskBarTest02Form.FormCreate(Sender: TObject);
begin
    dwLong := GetWindowLong(Application.Handle,GWL_EXSTYLE);

    OriginalProc :=Self.WindowProc;
    Self.WindowProc := SubclassProc;
end;

end.


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加