コマンドプロンプトに間接的に文字を入力するには?

解決


RC2  2006-04-01 08:03:42  No: 20775

Delphi初心者です。

ShellExecute(0,nil,pchar('cmd.exe'),nil,nil,SW_NORMAL);
を用いることにより、コマンドプロンプトを起動させられることはわかったのですが、そこに文字を間接的に(=コマンドプロンプトを選択してキーを押さないで)入力する方法がわかりません。

http://lupin.client.jp/delphi/index.html#37
を参照してみましたが、いまいちよくわかりません。

どうぞ、ご教授ください。


Mr.XRAY  URL  2006-04-02 06:34:39  No: 20776

Windows9Xの時は,確かクリップボード経由の方法があったと,かすかに記憶
していますが,Windows2k,XPで,コマンドプロンプトに文字列を出力するのは
結構困難ではないかと思います.
(あまり必要性がないのかも知れません)

コマンドを実行するのであれば,起動引数に与えるか,BATファイルを起動する
なりの方法が考えられますが,純粋に文字列を表示する方法として考えられる
のは,
(1) コマンドプロンプトを最前面のウィンドウにして,
(2) そこにkeybd_eventで文字を1つづつ送る
    keybd_eventはスキャンコードを解釈することに注意
(3) 送りおわったら,自分をまた再前面(フォーカス)ウィンドウにする

でしょうか.
(2)と(3)の間には多少のタイムラグが必要です.


Mr.XRAY  URL  2006-04-02 09:14:16  No: 20777

>    keybd_eventはスキャンコードを解釈することに注意
間違いました.
正しくは
コマンドプロンプトは,スキャンコードを解釈することに注意
です.つまり,キーボードの各々のキー固有値をKeybd_eventの引数にするとい
うことです.


倒壊  2006-04-02 17:29:38  No: 20778

直接コマンドプロンプト?を呼び出して実行できます。

WinExec(PChar('実行コマンド' + ' /オプションスイッチ等'), SW_SHOW);


RC2  2006-04-02 22:30:08  No: 20779

>>Mr.XRAYさん
一文字づつおくることに成功しました。ありがとう御座います。

>>倒壊さん
WinExec(PChar('cmd' + 'cd c:\'), SW_NORMAL);
などとしてみましたが、ディレクトリは変りませんでした…。

すみませんが、c:\に移動させるコードの例を書いていただけませんか?


Mr.XRAY  URL  2006-04-02 22:45:45  No: 20780

>すみませんが、c:\に移動させるコードの例を書いていただけませんか?
と言うことは,コマンドプロンプトに任意の文字列を表示(タイプ)すると
いうことではなく,コマンドを実行したいということでしょうか.

もしそうなのでせあれば,まず,先のレスで1文字づつ送るのであれば,
CmdWndがコマンドプロンプトのハンドルである場合,以下のようにできます.

procedure TForm1.Button2Click(Sender: TObject);
var
     S : Word;
     Str : String;
     i   : Integer;
begin
   SetForegroundWindow(CmdWnd);
   //コマンドプロンプトでDIRを実行
   Str:=Char($44)+Char($49)+Char($52)+Char(VK_RETURN);
   for i:=1 to Length(Str) do begin
     S:=Ord(Str[i]);
     keybd_event((S),0,0,0);
     keybd_event((S),0,KEYEVENTF_KEYUP,0);
   end;
   Sleep(100);
   SetForegroundWindow(Handle);
end;

また,コマンドプロンプトを起動して直ちにコマンドを実行したいのであれば,手前みそですが,以下のURLを参考にしてみて下さい.
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_CmdPrompt1.htm

このコード中で,Button1Clickの
  AParams:='/k CD C:\';
を変更すればいろいろ実行できます.複数のコマンドを続けて実行したい
場合は,以下のURLを参考にして下さい.
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_ConsoleBat1.htm

必要であれば,WinExecで置換えて下さい.


かみづ  2006-04-02 23:26:07  No: 20781

> していますが,Windows2k,XPで,コマンドプロンプトに文字列を出力するのは
> 結構困難ではないかと思います.

CreateProcess→CreatePipeして標準入力に書き込むが出来ると思います。


倒壊  2006-04-02 23:33:36  No: 20782

ちょっと、やりたいことを勘違いしていたかも・・・。

WinExec 自体がコマンドプロンプトみたいなものなので、
例えば
  WinExec(PChar('notepad.exe'), SW_NORMAL);
とすると、notepad.exe が起動しますし
  WinExec(PChar('hogehoge.bat'), SW_NORMAL);
とすると、指定したバッチファイルが起動します。

実際にコマンドプロンプトを表示せずに、コマンドを実行します。
したがって、'cd c:\' みたいなコマンドには不向きです。


Mr.XRAY  URL  2006-04-03 02:14:15  No: 20783

>CreateProcess→CreatePipeして標準入力に書き込むが出来ると思います。
実はこれ,MLのログを参考にしてやったことがあるんですが,標準出力,入力
に書き込みと読出しはできました.
残念ですが,プロンプトには表示することができず,断念していまいました.

プロンプトに表示するような必要性が今のところないものですから...
今更,やる気なしでごさいます.ハイ.


RC3(明日から)  2006-04-03 03:09:15  No: 20784

>>Mr.XRAYさん
>>かみづさん
>>倒壊さん

解決しました!バッチプログラム組んだほうが早いことは明確だったのですが、どうしてもDelphiで外部から操作したかったので、いろいろお手数かけることになってしまいました。

最終的には与えられたファイルの名前をすべて符号化して、一括して処理できるようにします。

ありがとうございました。


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

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






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