iT邦幫忙

1

請教如何讓電腦只執行一個應用程式

為了讓電腦一直執行一個可以讀取BarCode條碼槍的應用程式
且這個電腦沒有安裝鍵盤、滑鼠
而目前該應用程式重開機後都是可以佔在主要執行的劃面

但偶爾(1%)會發生Focus跳離那個應用程式
而造成BarCode無法再運作下去
ex.Windows的警告訊息

此時該使用者只能讓電腦重開機
好讓該BarCode應用程式又回到主要執行
這讓我有點困擾

是否可以讓Windows限制只執行該應用程式
或者什麼工具,可以設定週期時間(ex.每1分鐘)
就去檢查目前的作用中的應用程式若不是該用應用程式
就強制讓指定的應用程式回到Focus的應用程式

請不吝分享您的經驗、方法、工具
感謝、再感謝

ccutmis iT邦高手 10 級 ‧ 2019-05-25 20:06:39 檢舉
這個給樓主參考 缺點就是要安裝autoit
https://blog.xuite.net/dizzy03/murmur/411433654-%5BAutoIt%5D+WinActivate+-+Activates+%28gives+focus+to%29+a+window.
或搜尋"autoit winactivate focus"

如果熟悉Python程式的話
也可以試試 Pywinauto這個套件
slime iT邦大師 1 級 ‧ 2019-05-25 22:10:40 檢舉
通常 Barcode 程式表示有讀取資料, 例如產線上產品通過時,
如果產線有固定通過的週期, 可以用工作排程器檢查 Barcode 程式收下的資料, 存到特定的檔案, 該檔案若多久內無異動, 則強制停止(taskkill)再啟動.

其他檢查方式:
https://social.msdn.microsoft.com/Forums/zh-TW/99d3dbf2-edca-4232-803e-f4d9df6a0f96/vb-2010-sendkeys-2183938988?forum=232
goodnight iT邦研究生 4 級 ‧ 2019-05-27 23:56:25 檢舉
寫一個批次檔應該可以吧
@ECHO OFF
:START
BARCODE

但是如果程式不是跳離就沒用了, 例如縮小
或考慮這樣的鍵盤 https://www.macuknow.com/node/75147
蠻貴 https://24h.pchome.com.tw/prod/DCAH10-A9008KLJZ
GOTO START

2 個回答

2
rogeryao
iT邦高手 7 級 ‧ 2019-05-25 22:45:04

A.參閱如何防止程序在Windows中竊取焦點找出竊取焦點的程式讓它停止發生,可安裝以下軟體(擇一)確保程式在最頂層
1.DeskPins(將任何窗口保持在最頂層)
2.Window On Top (頂部的窗口)(windows 10 / windows 8 / windows 7 / vista / xp)

B.Keeping a form focused (not a question)

C.自己寫一支程式 call 要執行的應用程式 (例如 :Notepad.exe)
Delphi Code :

uses ......, ShellApi ,extctrls;
......
......

var
  Form1: TForm1;
  ExecuteIpClassName : PWideChar;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
  ExecuteFile : string;
  SEInfo : TShellExecuteInfo;
begin
  // Timer1 間隔 100 毫秒
  Timer1.Interval := 100;
  // 設定外部程式
  ExecuteFile := 'c:\Windows\Notepad.exe';
  ExecuteIpClassName := 'NotePad';
  //
  FillChar(SEInfo, SizeOf(SEInfo), 0) ;
  SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
  with SEInfo do 
  begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile) ;
    // 視窗最大化啟動外部程式
    nShow := SW_SHOWMAXIMIZED;
  end;
  // 呼叫外部程式
  ShellExecuteEx(@SEInfo);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var WinHandle: HWND;
begin
  WinHandle := FindWindow(ExecuteIpClassName,nil);
  // 外部程式失去 Focus , 重新 Focus
  if WinHandle <> 0 then
  begin
    SetForegroundWindow(WinHandle);
  end;
end;
hisniper iT邦新手 2 級 ‧ 2019-05-27 13:47:45 檢舉

太感謝你的回答,你的回答很完整
其中前面二個可以讓應用程式維持在畫面的最上面,但游標Focus不一定會回來。
你的第三個方法,很像就是我最後找到解決的方法,我用關鍵字SetForegroundWindow找到一個API,它解決了我的問題
謝謝大家的幫忙

0
vegalou
iT邦新手 4 級 ‧ 2019-05-31 08:31:32

HOOK, Window Focus.

終端裝置的第一步設計。

我要發表回答

立即登入回答