2017-10-10 6 views
1

ShellExecで「設定」モードでスクリーンセーバーを実行したい。そうどこかで道路上のWindowsは私の呼び出しをインターセプトし、「/ S」と私のパラメータを置き換える、ShellExecuteで 'config'モードでスクリーンセーバーを実行するには? OSが私のShellExecuteコールを無効にする

i:= ShellExecute(0, 'open', PChar('c:\temp\test.scr'), PChar('/c'), NIL, SW_SHOWNORMAL) 

しかし、SCRファイルが受信したパラメータである「/ S」:私はこの(デルファイ)の呼び出しを使用しています。
私はアプリ(mytest.exe)を内蔵したパラメータを示しています


更新
は私が実験を行いました。 /cをパラメータとしてmytest.exeを起動しました。/cパラメータが正しく受信されました。
次に、mytest.exeの名前をmytest.scrに変更しました。これで、送信されたパラメータはOSによって上書きされます。受信したパラメータは '/ S'になりました。

興味深い!

ダーティフィックス:/ cモードでスクリーンセーバーを実行するCMDファイルを実行すると機能します!

+0

これは、プロセスを開始する間違った方法です。正しい関数はCreateProcess –

+0

はいです。知っている。 (ShellExecuteExはShellExecuteよりも優れたオプションです)。しかし、私はこれを修正するために、早急に(つまり、汚いものも受け入れられる)方法が必要です(私は、ShellExecuteを構築したエコシステム全体を持っています)。 - あるいは、CreateProcessを呼び出すことでこれが解決されると思いますか?私はとにかく来る日にShellExecuteをCreateProcessに置き換えることにします。 – Ampere

+0

CreateProcessは常に実行可能ファイルを開始する方法です。あなたはいつもそうしなければなりません。シェルがあなたを倒してしまわないようにしてください。 –

答えて

5

レジストリで見れば、あなたは.SCRファイル拡張子のためopen動詞がデフォルトで/Sパラメータを指定してファイルを起動するように登録されていることがわかります。

image

だから、あなたの/cパラメータ無視されます。

あなたの代わりにopenconfig動詞を使用し、.scrファイルの設定画面を呼び出したい場合は、次のパラメータを指定せずに.scrファイルを実行

image

ShellExecute(0, 'config', PChar('c:\temp\test.scr'), nil, nil, SW_SHOWNORMAL); 

はとそれを実行するのに似ています/cパラメータ(前景モダリティなし):

INFO: Screen Saver Command Line Arguments

 
    ScreenSaver   - Show the Settings dialog box. 
    ScreenSaver /c  - Show the Settings dialog box, modal to the 
          foreground window. 
    ScreenSaver /p <HWND> - Preview Screen Saver as child of window <HWND>. 
    ScreenSaver /s  - Run the Screen Saver. 

そうでない場合は、あなたが直接/cパラメータを指定することができますCreateProcess()の代わりShellExecute().scrファイルを実行します。

var 
    Cmd: string; 
    SI: TStartupInfo; 
    PI: TProcessInformation; 
begin 
    Cmd := 'c:\temp\test.scr /c'; 
    UniqueString(Cmd); 

    ZeroMemory(@SI, SizeOf(SI)); 
    SI.cb := SizeOf(SI); 
    SI.dwFlags := STARTF_USESHOWWINDOW; 
    SI.wShowWindow := SW_SHOWNORMAL; 

    if CreateProcess(nil, PChar(Cmd), nil, nil, False, 0, nil, nil, SI, PI) then 
    begin 
    CloseHandle(PI.hThread); 
    CloseHandle(PI.hProcess); 
    end; 
end; 
+0

完全に答えてくれてありがとう! – Ampere

関連する問題