喫茶XRAYトップページ

[スレッド全体
]

[1199] 他のプログラムからアクティブにされた場合のイベント取得は?返信 削除
2007/4/13 (金) 17:16:55 Syake
マスター、皆様こんちは
ちょっとお知恵をお借りしたいと思います。

とあるプログラム(A)は他のプログラムを起動した際に非表示になります。
が、再度プログラム(A)を起動しようとすると、先程のプログラム(A)が
再表示され前面に現れます。
何故、消す必要があるの?ってのは無しにして下さい。

消す時の処理
 //フォームの非表示とタスクバーからアイコンを消す。
 ShowWindow(Self.Handle,SW_HIDE);
 ShowWindow(Application.Handle,SW_HIDE);

プログラム(A)の起動時処理
 (略)
 HWHD := FindWindow(nil,PChar(MutexName));
  if HWHD <> 0 then //おなじみの既に起動済み場合
  begin
    //アプリケーションのハンドルを取得(前回起動済みのプログラム(A))
    HAPP := FindWindow(PChar(ClassName), PChar(WindowName));
    //アプリケーションがアイコン化されていたら元のサイズに戻す
    if (IsIconic(HAPP)) then
    begin
       OpenIcon(HAPP);
    end;
    //前面に移動させる
    SetForegroundWindow(HAPP);
    if IsWindowVisible(HAPP) = False then //表示されているウィンドウを対象。
    begin
      AppHwnd := GetWindowLong(HAPP, GWL_HWNDPARENT);//
      ShowWindow(AppHwnd,SW_SHOW); //ウィンドウを表示する
      ShowWindow(HAPP,SW_SHOWDEFAULT);//タスクバーにアイコンを表示する
    end;
    AppRunFlg := True; //Trueだとこのプログラムは起動されない。
  end;
 (略)

ほんで、課題は再表示された時のイベントを捕まえるのはどうするんじゃろ?
って事です。
よろしくお願いします。<m(__)m>



[1201] Re:他のプログラムからアクティブにされた場合のイベント取得は?返信 削除
2007/4/13 (金) 22:03:10 Mr.XRAY
▼ Syakeさん

> 何故、消す必要があるの?ってのは無しにして下さい。

知りたい〜!! (ウソ、ウソ)

> ほんで、課題は再表示された時のイベントを捕まえるのはどうするんじゃろ?

単に、アクティブにされるウィンドウにメッセージを送るってのはどうで
しょうか。
ただし、アクティブにされる方もDelphi製で、自分でメッセージを受取る
コードを書くことが条件です。

====== 送る側 =========

procedure TSenderForm.Button1Click(Sender: TObject);
var
     hWindow   : HWND;
begin
     //受取る側のウィンドウハンドル
     hWindow := FindWindow('TReceivForm',nil);
     if hWindow<>0 then begin
       //アクティブにする等の処理
       SendMessage(hWindow,WM_USER+100,0,0);
       //またはここにアクティブにする等の処理
     end;
end;

====== アクティブにされる側 =========

procedure WMUser100(var Message: TMessage); message WM_USER+100;

を定義しておいて、このメッセージハンドラを

procedure TReceivForm.WMUser100(var Message: TMessage);
begin
     Panel1.Caption:='起こされてしまった!!';
end;

注意:
このメッセージのWParam,Lparam等に値を設定しても、異なるプロセスでは
受取れません。これができれば、先のTSさんのような悩みは簡単解決です。

追記:
HWNDという変数はやめた方がいいかと。予約語ですので... (^_^;)
特に理由があれば別ですが。余計なお世話だったらゴメンなさいませ。
後、あるサンプルコードからコピペしてオンライン修正ですので、よろしく。
(つまり、動作確認してございません)




[1206] Re2:他のプログラムからアクティブにされた場合のイベント取得は?返信 削除
2007/4/16 (月) 09:30:21 Syake
▼ Mr.XRAYさん
マスターありがとうございます。

そういえば、何かで使った事ある「SendMessage」

起動処理に追加
> SendMessage(hWindow,WM_USER+100,0,0);
フォームに追加
> procedure WMUser100(var Message: TMessage); message WM_USER+100;
上記で上手くいってございます。
アクティブにする側もアクティブにされる側もDelphi製同一のアプリですので
お蔭様で今回は無事に・・・・
 
> HWNDという変数はやめた方がいいかと。予約語ですので... (^_^;)
気をつけますです。 ありがとうございます。
> 余計なお世話だったらゴメンなさいませ。
とんでもございません。m(__)m

 

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