プロが教える店舗&オフィスのセキュリティ対策術

先に質問点を書きます。
1.Windowsでは、他の実行中のWindow(プログラム)にメッセージを送信して制御できるようですが、コマンドプロンプト画面にも送信できますか。
2.そういうツールご存じないですか。
3.Visual C のサンプルプログラムご存じないですか。
 (何もないと私には無理です。あっても無理かも・・・。)

長くなりますが、背景説明をします。
実行ファイル名は、用途が分かりやすいよう仮名にしてお訪ねします。

パソコンにUSB接続して使用するオシロスコープ装置を購入しました。
その添付ソフトのサンプルプログラムを改造して、MyPsCON.exeというWin32プログラムを作りました。
コマンドプロンプト画面で、このMyPsCON.exeを起動すると、信号入力がある度に電圧変化を読み取って、data.txtというファイルを書き出します。
作業を終了するときは、キーボードから「X」と1文字入力すると、装置がUSBセッション(?)をクローズして、パソコンのコマンドプロンプト画面が閉じます。

私は、上記MyPsCON.exeを、Windows版の自作プログラムMyPsWin.exeから起動(shell起動というんですか)しています。

次にやりたいことは、MyPsWin.exeからMyPsCON.exeに対して、任意の時点で「X」と文字入力してそのMyPsCON.exeを終了させたいのです。

MyPsCON.exeをバッチファイルで起動~終了まで一括動作させられますが、起動時には何回読取動作させるか分からないのでダメです。

そんな訳で、冒頭の質問になります。
winbatchという市販有料ソフトが目的に合いそうですが、これだけに使うには勿体ないです。

よろしくお願いします。

質問者からの補足コメント

  • 早々のレスありがとうございます。
    MyPsCON.exeはPCとUSBのセッション中なので、そのセッションを別のプログラムがクローズできないです。
    仮に可能だとしても、そういう難しいプログラムは私には作れないです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/06/15 09:27
  • 補足追加です。
    >MyPsCON.exeはPCとUSBのセッション中
    というのは、MyPsCON.exeの中のC言語の1つの関数を実行中という意味です。

      補足日時:2015/06/15 09:36
  • うーん・・・

    >CreatePress()APIをいる場合ならば、
    "shell起動"という表現が間違いのようです。

    MyPsCON.exeは、独立したコマンドプロンプトウィンドウの中で実行しています。
    手動でコマンドプロンプトウィンドウを開いてMyPsCON.exeを起動したのと同じ状態です。

    MyPsWin.exeと、MyPsCON.exeとは、両方起動した状態で、交互処理が必要なんです。
    (最初はdll方式で交互に動作させるつもりでしたが、やめました。)

    "パイプ"処理たど、exeの実行開始から終了時点まで連続してコントロールしなくちゃいけないのではありませんか。

    手動の場合は、
    MyPsCON.exeを実行中のコマンドプロンプトウィンドウをマウスでクリックして、[X]キーを押しますが、その操作だけ、MyPsWin.exeを終了する前に1回実行させたいのです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/06/15 14:49
  • どう思う?

    また追記です。

    先の質問[1.]に相当する事例がありました。
    他アプリへの文字入力1
    http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_ …

    SendMessageAPI関数は、コマンドプロンプトウィンドウで実行中のMyPsCON.exeに適用できるんでしょうか。

    これがダメなら、あきらめます。

      補足日時:2015/06/15 15:12

A 回答 (4件)

MyPsCONのソースから、装置とのやりとりの部分を抜き出して、MyPsWinの中に組込むのがいいように思います。

この回答への補足あり
    • good
    • 0

>私は、上記MyPsCON.exeを、Windows版の自作プログラムMyPsWin.exeから起動(shell起動というんですか)しています。



どのように起動させています?
CreatePress()APIを使用している場合ならば、標準入力のハンドルを作成して使用することで、
親プロセスから子プロセスへの標準入力を操作することが可能です。
# 標準出力や標準エラー出力も用意すればコマンドプロンプトの画面を出さない。というのも可能かと思われます。

「CreateProcess パイプ」辺りで検索して下さい。


以前の質問の内容でDLL化していた場合は、そういう処理できませんのでご注意を。
http://oshiete.goo.ne.jp/qa/9001216.html
この方法(main()をDLLMain()に変更)だと、LoadLibrary()から処理戻ってこないでしょうしね。


私なら…元々の環境で用意されているライブラリ使って、自前でデータの取得などを行うようにしますが…。
ってまさに#1さんが回答されている通りの方向ですな。
# 環境もないし試す気はないのがアレですけどね。
# 試す為に使う予定のないオシロを買う気も無いですし。
# (まぁ、手元にあれば使うコトもあるかも知れませんけどね……。電気畑ではなくソフト畑なので微妙すぎですけど)
この回答への補足あり
    • good
    • 0

それなら、 MyPsCon相当の部分を別スレッドにして、GUI等の処理と並列に処理されてばいいのでは。

    • good
    • 0

既存のプログラムを取り込むのがめんどくせー。

ってのは判らんでもないですけどね……。

>SendMessageAPI関数は、コマンドプロンプトウィンドウで実行中のMyPsCON.exeに適用できるんでしょうか。

実行しているアプリに対しては適用できませんが、そのコマンド プロンプトのウィンドウへの適用は可能でしょう。
プログラムを実行しているコマンド プロンプトのウィンドウを検索するのが少々手間かも知れませんけど。

とりあえず、普通に起動しただけのコマンド プロンプトに対して、下記の処理で「a」が入力されたのは確認しました。
# Windows7 64BitにVC++2010Expressにて

 HWND hConsoleWnd = NULL;

 hConsoleWnd = FindWindowEx(NULL, NULL, TEXT("ConsoleWindowClass"), TEXT("管理者: コマンド プロンプト"));
 if(hConsoleWnd) {
  SendMessage(hConsoleWnd, WM_CHAR, (WPARAM)'a', (LPARAM)0);
 }

FindWindowEx()の第4引数が問題になる…かも知れませんな。
# 複数起動していたらどうなる?とか、FindWindowEx()からSendMessage()までの間にウィンドウ閉じられたら(普通は無理ですが)どうする?とか……。
ちなみに、第4引数の文字列はSpy++にて該当ウィンドウのプロパティから取得。
見た目だけだと半角スペースの数とか合わないかも知れないから。
    • good
    • 0
この回答へのお礼

MyPsWin.exeを作った開発ソフトは、VCやVBでなく、xBASE言語のARAGOってやつで、API関数を使うには、当方また別の苦労があります。
でも、実現の可能性があるということが分かれば、充分です。
プロンプト画面での動作確認、ありがとうございました。

当方VC++2010もインストールしてます。実用したことないんですが・・・。

実は背景説明不足で、当方の使い方や操作状況が伝わっていませんでした。
オペレーターの操作を含めたフローチャートでも提示すればよく分かってもらえたと思います。

また、最初から、SendMessageというトピックにしてたら、話が早かったですね。
いい教訓になりました。
次回はもっと上手に質問しますので・・・・。

お礼日時:2015/06/16 16:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!