スクリーンキーボードをタスクバーから非表示にできないかと考えております
検索して以下のソースを発見したのですが、うまく隠せなかったので四苦八苦しております
HW := FindWindow(nil,'スクリーン キーボード');
SetWindowLong(HD, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
何か良い方法はないでしょうか?
HDは何の変数ですか?(HWの転記ミス?)
FindWindowで取得したウィンドウハンドルを、
以後の関数2つに渡していないのが原因では?
「スクリーンキーボード」が自前のアプリなら、
フォーム作成時にスタイル変更すれば隠せるよ。
提示したコードは,アプリケーションのアイコンをタスクバーに非表示する
時に使用しますよね.
これは,プロジェクトソースに記述していると思います.
つまりアプリケーションの作成時に行っているわけです.
実行時,つまり動的にスタイルを変更する場合は,そのままではできません.
一度,ウィンドウを非表示にします.
以下はメモ帳の場合です.
その対象となるスクリーンキーボードでうまくいくかどうかは分かりません.
試してみる価値はあると思います.
動作確認は, 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.
もう1つ,念のため,ご自分の開発環境を書くのも質問の際は常識だと考えてください.
今回はどうかは分かりませんが,問題によっては,環境によって動作したり
しなかっりする場合があります.
ちょっと前のスレッドでFusaさんが教えて下さったリンクを再掲しておきます.
DOBON.NETプログラミング道掲示板 書き込みのルールについて
http://dobon.net/vb/bbs/index.html#manners
ゴメンなさい.Botton2Clickがおかしいですね.
SetWindowPosでSWP_SHOWWINDOWを追加してください.
それと,非表示から表示にするのでZオーダは常にトップですね.
>その対象となるスクリーンキーボードでうまくいくかどうかは分かりません.
例えば,
【質問】
テレサという方の作成したアプリを起動すると,自分のアプリがタスクバーから
消えてしまいます.どうしたら,表示するようにできるでしょうか.
というのがあったとします.
これを実現するために,以下のようにサブクラス化で対応することもできます.
(別にサブクラス化でなくてもいいのですが.他のいい方法があるかも知れません)
つまり,このような対応をしている場合は,先に提示したコードではできない
ということです.
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.
ツイート | ![]() |