ここから本文です

C++で外部ソフトを操作する方法を教えてください。 別のソフトを起動して、作...

dor********さん

2018/2/1323:22:29

C++で外部ソフトを操作する方法を教えてください。


別のソフトを起動して、作成しているソフトからショートカットキーのキーを渡す方法を教えてください。

また、CreateProcess関数でメモ帳を起動したのですが、保存して名前(連番)を付けて閉じる方法を教えてください。

最後に
windowsプログラムを作りたいのですが、こういった類はどう勉強していけばいいか分かりません。

閲覧数:
112
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2018/2/1821:58:05

(1)『別のソフトを起動して、作成しているソフトからショートカットキーのキーを渡す方法を教えてください。』

別のご質問ページでお答えしていますが、改めて流れをご説明したいと思います。

EnumWindows でウィンドウを列挙します。そして個々のウィンドウに対して GetWindowThreadProcessId を実行してプロセスIDを得ます。そのプロセスID が今起動した者かどうかを確認して(CreateProcess による起動でしょうからプロセスIDは分かっているわけです)、当たりだったら「ショートカットキーのキーを渡す」処理に進みます。


あらかじめINPUT 構造体の配列を用意しておきます。「ショートカットキーのキー」というと単数のように聞こえますが実際にはキーストロークのシーケンス(列)になるかと思いますので、そういうわけで配列。

え?日本語だから単数とか複数とか区別ないだろうって?

ですね。ただ、この業界におきましては単数と複数を区別したい気持ちが強くなりますので、ですので「キー」を例えば「キー群」とかという風に表現する手もあります。

あ、すみません。余計な話に切り替わってしまってました。


それで INPUT 構造体の配列の用意の仕方ですが、これは資料をご覧になった方が早いでしょう。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v...

英語版になります。(日本語版のページもあるかもしれませんが見ないようにしてます。間違いがあったり、かえって分かりにくかったりするからです。)


この INPUT 構造体の配列をですね、SendInput 関数を使用して相手先に送り付けます。で、相手先をどうやって指定するかと言いますと、先ほどの処理で分かったウィンドウハンドルに対して SetForegroundWindow を行います。

ここまでをまとめます。


① EnumWindows でウィンドウを列挙
② GetWindowThreadProcessId でプロセスID を取得し、該当するウィンドウを探す
③ SetForegroundWindow で当該ウィンドウをアクティブ化
④ SendInput でキーストローク列を創出

以上です。


(2)『また、CreateProcess関数でメモ帳を起動したのですが、保存して名前(連番)を付けて閉じる方法を教えてください。』

これは(1)の回答を参照していただければ出来るかと。また、具体的なコード例は別質問の方に掲載済みですのでこれを弄っていただくと自在に出来るのでは。


(3)『最後にwindowsプログラムを作りたいのですが、こういった類はどう勉強していけばいいか分かりません。』

ですよね。

今、このような「windowsプログラムを作りたい」とおっしゃる方がどれくらいいらっしゃるのか分からないのですが大変気の毒に思います。

だって、良い入門書が無いから。無いでしょう…、多分。探したことないですが無いと思いますよ。

昔はありました。ていうか、昔の人はみんなこういった種類のプログラムを作りたがったものです。全員ですよ。高級なプログラムは無い時代でしたのでね。(いや、Windows GUI プログラムというだけでもう十分すぎるほど高級でした。)

たとえば Visual C++ 1.0 を購入すると(約10万円でした。高かったなぁ。無料版はありませんでした。)、Windows SDK の書籍が一気にそろってしまうという寸法になってましてね。で、その書籍を読めば間違いない。すべてわかる形になっていました。

その時の知識でウィンドウを扱うことが今でも出来てしまいます。若干、それに毛の生えた程度の知識も必要になったりもしてますけど。

他には Charles Petzold という偉大な方がいらっしゃいましてね。この方の書いた書籍はバカ売れだったと思います。皆これを買い求めてたのではないかと。ちらっと見たことがあります。何回かです。(購入はしませんでしたが。SDK のマニュアルでいいやっていう感じがあったので。)

中古でも売られてたら購入してみるのも悪くないかも。Windows の GUI プログラミングとして、これくらいは知らないと駄目でしょ的なものが詰まってると思います。ただし、時代が違いますので完全にそのまま通用するかどうかは別の話となりますが。


あと、ネット内ではですね、偽情報っていうかガセというか、出鱈目というか、間違った情報が沢山あります。騙されないように注意してくださいね。こういう場合はこのようにコーディングすると良いとあっていうのが全然良くないってこともあると思われます。そういう情報は見ないのが一番。

日本語の情報は特に怪しいです。分かってない人が書いてるんじゃないかなって思います。

え?この回答自体も怪しいのかって?

そう思われてしまうと残念なのですが、むしろそのくらいに構えていた方が良いかもしれません。

なるべく一次情報に当たるようにすると良いと思います。その情報の出どころが一番です。マイクロソフト絡みでしたらマイクロソフト社自身が出している情報です。日本のは駄目ですよ。日本のマイクロソフト社は全く信用できません。昔からです。

英語の情報を読むのは大変かもしれませんが(え?大変じゃないんですか?一般論として申し上げました。大変じゃない方もいらっしゃるでしょう)、でも益するところは大であると考えています。


長話になり、すみませんでした。

この種のプログラミングに興味を持ってらっしゃるというのが素晴らしいなぁって思ったものでつい…。

ではこの辺で。

この質問は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

tar********さん

2018/2/1400:23:34

(1)
Windows API
keybd_event
SendInput
あたりを使う感じでしょうか。
https://msdn.microsoft.com/ja-jp/library/cc364822.aspx
https://msdn.microsoft.com/ja-jp/library/cc411004.aspx
操作対象のウィンドウをアクティブにする操作と組み合わせるなどして。

(2)
これが似たようなことやってそう。
言語がVB系みたいですけど。
http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendinput/

(3)
Windows のプログラムのつくりかたはいろいろあるので
どの言語とライブラリで作るのか決めて、それを勉強する感じでしょうか。
C+Windows API だけでつくるとか
C++ + MFC でつくるとか
C#/VB + Form などのGUIライブラリでつくるか
Java でもそれなりに GUI アプリをつくれますし
スクリプト言語でも GUI ライブラリと組み合わせたりできそうです。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる