以前「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;
ShellExecuteEXで開いてハンドルを取得、その後Qキーをフックして終了するように
コードを書けばもんだいないかと。
1はTimerじゃなくてApplicationIdolイベントに書けばいいと思いますよ。
Idok>Idleですね
それはさん、ついでさん、失礼さん、お返事有り難うございました。
解決しました。
有り難うございました。
ツイート | ![]() |