ShellExecute(Handle, 'OPEN', '・・・で起動したアプリを閉じるには

解決


新米  2008-10-23 10:30:02  No: 32339

以前「Windows画像とFAXビューアーを使えませんか」で
質問させて頂いた新米です。
やっとFAXビューアーを使ったスライドショーのひな形を
「美味しい草なら 」さんのサンプルを元に、
元来同一フォルダ内の再生用を任意のフォルダのファイルを集めて
ファイルをListboxに取得してスライドショーをするように作りました。
質問は
(1)このアプリがFAXビューアーに隠れた状態で動くのが運命なので
キーアクションを取得するのにいろいろやってタイマーを付けておけば
キーアクションを取得してショーができましたが、
タイマーのアクションに頼るのでレスポンスが悪い。
何かいい方法はないでしょうか。
(2)ShellExecute(Handle, 'OPEN', 'Rundll32.exe',PChar(・・で起動したFAXビューアーを
キーアクション(この例ではQ)で閉じることができないでしょうか。
参考サイトを見てやりましたが閉じてくれません。

以上2点ですっきりしません。よりよい方法をできましたらお願いします。
見苦しいコードですが最低動く要点を書いてみます。
var  ListNo:integer;
//画像ファイルパスをListboxに登録する
procedure TForm1.Button1Click(Sender: TObject);
var  i:integer;
begin
    Application.OnMessage := MsgHandler;  //スライドショーのキーアクションキャッチ
    ListBox1.Sorted:=true;
    OpenDialog1.Options:=[ofAllowMultiSelect]; //複数のファイルを選択する
    if OpenDialog1.Execute then
        for i := 0 to OpenDialog1.Files.Count - 1 do
            Listbox1.Items.Add(OpenDialog1.Files[i]);

    ListNo:=0;
end;
//キーアクションを取得してファイルリストの次か前か終了かを渡す。
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
var KeyNo:integer;
begin   //次へZ
        if (GetAsyncKeyState(90) <> 0) then begin Sleep(250);SlideShowDisp(1);exit;end
        else  //前へ A
        if  (GetAsyncKeyState(65) <> 0) then begin Sleep(250);SlideShowDisp(2);exit;end
        else  //Qは終了
        if  GetAsyncKeyState(81)<>0   then begin Sleep(250);SlideShowDisp(8);exit;end;
end;
//キーアクションの命令を受けて前後のファイルを取り出して表示する
procedure TForm1.SlideShowDisp(const c:integer);
var
    hd:HWND;
    Path:string;
begin
    if ListBox1.Items.Count=0 then exit;
    case  c of
        1:  begin ListNo:=ListNo+1;end;  //------次へ  Z
        2:  begin ListNo:=ListNo-1;end;  //------前へ  A
        8:  begin                                //-----終了
              hd := FindWindow('Rundll32.exe',nil);
              SendMessage(hd, WM_CLOSE, 0, 0);  //FAXビューワーが閉じてくれない
              exit;
            end;
        else exit;
    end;
    if ListNo<0 then ListNo:=0;
    if ListNo>ListBox1.Items.Count-1 then ListNo:=ListBox1.Items.Count-1;
    Path:= 'shimgvw.dll,ImageView_Fullscreen '+ListBox1.Items.Strings[ListNo];
    ShellExecute(Handle, 'OPEN', 'Rundll32.exe',PChar(Path), nil, SW_SHOW); 
end;
//なぜか後ろに隠れるとキーが効かないのでタイマーを付けてみた(スマートでない)
procedure TForm1.Timer1Timer(Sender: TObject);
begin
      {Nothing}
end;


それは  2008-10-24 11:21:51  No: 32340

ShellExecuteEXで開いてハンドルを取得、その後Qキーをフックして終了するように
コードを書けばもんだいないかと。


ついでに  2008-10-24 11:23:00  No: 32341

1はTimerじゃなくてApplicationIdolイベントに書けばいいと思いますよ。


失礼  2008-10-24 11:23:40  No: 32342

Idok>Idleですね


新米  2008-10-25 06:38:09  No: 32343

それはさん、ついでさん、失礼さん、お返事有り難うございました。
解決しました。
有り難うございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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