Delphi初心者です。
ShellExecute(0,nil,pchar('cmd.exe'),nil,nil,SW_NORMAL);
を用いることにより、コマンドプロンプトを起動させられることはわかったのですが、そこに文字を間接的に(=コマンドプロンプトを選択してキーを押さないで)入力する方法がわかりません。
http://lupin.client.jp/delphi/index.html#37
を参照してみましたが、いまいちよくわかりません。
どうぞ、ご教授ください。
Windows9Xの時は,確かクリップボード経由の方法があったと,かすかに記憶
していますが,Windows2k,XPで,コマンドプロンプトに文字列を出力するのは
結構困難ではないかと思います.
(あまり必要性がないのかも知れません)
コマンドを実行するのであれば,起動引数に与えるか,BATファイルを起動する
なりの方法が考えられますが,純粋に文字列を表示する方法として考えられる
のは,
(1) コマンドプロンプトを最前面のウィンドウにして,
(2) そこにkeybd_eventで文字を1つづつ送る
keybd_eventはスキャンコードを解釈することに注意
(3) 送りおわったら,自分をまた再前面(フォーカス)ウィンドウにする
でしょうか.
(2)と(3)の間には多少のタイムラグが必要です.
> keybd_eventはスキャンコードを解釈することに注意
間違いました.
正しくは
コマンドプロンプトは,スキャンコードを解釈することに注意
です.つまり,キーボードの各々のキー固有値をKeybd_eventの引数にするとい
うことです.
直接コマンドプロンプト?を呼び出して実行できます。
WinExec(PChar('実行コマンド' + ' /オプションスイッチ等'), SW_SHOW);
>>Mr.XRAYさん
一文字づつおくることに成功しました。ありがとう御座います。
>>倒壊さん
WinExec(PChar('cmd' + 'cd c:\'), SW_NORMAL);
などとしてみましたが、ディレクトリは変りませんでした…。
すみませんが、c:\に移動させるコードの例を書いていただけませんか?
>すみませんが、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で置換えて下さい.
> していますが,Windows2k,XPで,コマンドプロンプトに文字列を出力するのは
> 結構困難ではないかと思います.
CreateProcess→CreatePipeして標準入力に書き込むが出来ると思います。
ちょっと、やりたいことを勘違いしていたかも・・・。
WinExec 自体がコマンドプロンプトみたいなものなので、
例えば
WinExec(PChar('notepad.exe'), SW_NORMAL);
とすると、notepad.exe が起動しますし
WinExec(PChar('hogehoge.bat'), SW_NORMAL);
とすると、指定したバッチファイルが起動します。
実際にコマンドプロンプトを表示せずに、コマンドを実行します。
したがって、'cd c:\' みたいなコマンドには不向きです。
>CreateProcess→CreatePipeして標準入力に書き込むが出来ると思います。
実はこれ,MLのログを参考にしてやったことがあるんですが,標準出力,入力
に書き込みと読出しはできました.
残念ですが,プロンプトには表示することができず,断念していまいました.
プロンプトに表示するような必要性が今のところないものですから...
今更,やる気なしでごさいます.ハイ.
>>Mr.XRAYさん
>>かみづさん
>>倒壊さん
解決しました!バッチプログラム組んだほうが早いことは明確だったのですが、どうしてもDelphiで外部から操作したかったので、いろいろお手数かけることになってしまいました。
最終的には与えられたファイルの名前をすべて符号化して、一括して処理できるようにします。
ありがとうございました。
ツイート | ![]() |