VisualC++で他のウィンドウのボタンを自動的に押す方法

このQ&Aのポイント
  • VisualC++で作成したアプリケーションから、他のWindowsアプリケーションの特定のウィンドウをアクティブにし、その中のボタンを自動的に認識して押す方法を知りたいです。
  • 具体的には、Windowsの電卓アプリケーションのウィンドウをアクティブにし、その中の「1」ボタンを押す操作をプログラムで実現したいです。
  • 関連する技術の名前やMFCでのAPI名を教えていただけると幸いです。また、使用する関数やライブラリについてもお知りになりたいです。
回答を見る
  • ベストアンサー

他のウィンドウのボタンを自動的に押したい

VisualC++で作ったアプリケーションから、例えばWindowsに標準搭載の「電卓アプリケーション」のウィンドウをアクティブにして、さらにその中の「1」ボタンを認識して押す、テキストボックスを認識してそこに文字列を入れるといったソフトを作りたいです。 簡単にいうと、他のアプリケーションを自動的に操作するソフトを作りたいのです。 これを実現するために、Web検索してみましたが、関連する技術の名前やMFCでのAPI名がわからないです。これはどういった名前の技術で、VisualC++でどういった名前の関数を使うのでしょうか? 当方の環境はWindowsXP&VisualC++6.0です。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★列挙方法のアドバイス ・補足になる仕様の >(1)ウィンドウのタイトルバーの名前(例:「電卓」)、 >またはウィンドウのIDでウィンドウを探す  ↑  これなら FindWindow() 関数でウインドウ・ハンドルを探せます。  例: HWND hWnd = FindWindow( "SciCalc", "電卓" ); >(2)最初にヒットしたウィンドウをアクティブにする  ↑  最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。  例: SetForegroundWindow( hWnd ); >(3)アクティブにしたウィンドウの中にあるボタンを探す  ↑  (1)で取得しているウインドウに対して子ウインドウ(ボタンなど)を列挙します。  列挙には EnumChildWindows() 関数と EnumChildProc() のコールバック関数を使います。 >(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す  ↑  列挙のコールバック関数(EnumChildProc)でボタンのキャプションを調べて  『1』となっている文字列が電卓の『1』ボタンです。  このときにボタンを押す処理をプログラムから行います。  例: SendMessage( hChild, BM_CLICK, 0, 0 );  URL: http://wisdom.sakura.ne.jp/system/winapi/win32/win53.html ・上記のような感じで操作できます。  一番重要なのは操作するウインドウのハンドルを正しく見つけ出すことです。  このウインドウ・ハンドルを見つけるには次の方法があります。  (1)FindWindow() 関数を使う  (2)EnumWindows() 関数を使う  (3)Process32First()、Process32Next() 関数を使う  (4)EnumProcesses() 関数を使う  などがあります。  今回は簡単な(1)を紹介しました。  もしもウインドウのクラス名やキャプション名以外で詳しく捜査対象の  ウインドウを検索するには(2)の EnumWindows() 関数や起動パス名を  調べて特定できる (3)、(4)の関数群を利用します。 >テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。  ↑  ボタンなどのテキストを認識、保存には GetWindowText()、WM_GETTEXT メッセージを  使います。メッセージの場合は SendMessage() 関数でキャプション文字列を取得します。  例: SendMessage( hChild, WM_GETTEXT, sizeof(szBuff), szBuff ); ・下に簡単なボタンの列挙を載せます。これを活用して下さい。 サンプル: #include <stdio.h> #include <windows.h> // コールバック関数 BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam ) {  TCHAR szBuff[ 1024 ];    // キャプションの取得  GetWindowText( hWnd, szBuff, sizeof(szBuff) );  printf( "├[%s]\n", szBuff );  return TRUE; } // メイン関数 int main( void ) {  HWND hCalc;    if ( (hCalc = FindWindow("SciCalc","電卓")) != NULL ){   printf( "◆電卓のコントロール列挙\n" );   EnumChildWindows( hCalc, EnumChildProc, NULL );  }  return 0; } 以上。

moririn2
質問者

お礼

ありがとうございます。 サンプルプログラムを作ってみましたところ、うまく電卓アプリケーションの操作ができました。 また、教えていただいたキーワードを足がかりに、関連する技術用語も検索することができました。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス >他のアプリケーションを自動的に操作するソフトを作りたいのです。  ↑  操作したいアプリケーションのウインドウ・ハンドルを取得すればいろいろと  操作できます。ここが一番のポイントです。 ・例えとして『Windows電卓』の『1』ボタンを押す仕組みは  (1)起動しているであろう『Windows電卓』のウインドウ・ハンドルを取得  (2)トップレベルのウインドウ・ハンドルからコントロールの列挙  (3)列挙されてボタン、テキストボックスなどのキャプションを調べて目的の   コントロール(ボタンなど)のウインドウ・ハンドルを取得  (4)取得したボタンのウインドウ・ハンドルにプログラムから押された指示を出す  こんな感じになります。 ・それでどのようにウインドウ・ハンドルを得るかがポイントになります。  まずはどうやって他のアプリケーションを操作するのかの仕様を決めて下さい。  (1)マウスの下にあるウインドウを操作  (2)アクティブ・ウインドウを操作  (3)登録されたウインドウをひそかに操作  (4)その他  どのような仕組みで操作するのでしょうか補足して下さい。  良くフリーソフトなどではキーボードやマウス操作を記録して再生するソフトがあります。  このような仕様ですか?それとも別方式? ・以上。操作の仕様などを補足して下さい。

moririn2
質問者

補足

回答ありがとうございます。 私が考えている他のアプリケーションを操作する仕様は (1)ウィンドウのタイトルバーの名前(例:「電卓」)、またはウィンドウのIDでウィンドウを探す (2)最初にヒットしたウィンドウをアクティブにする (3)アクティブにしたウィンドウの中にあるボタンを探す (4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す といった仕様を考えています。 なぜ、このような質問をしたかというと、フリーウェアによくある操作再生だけではなく、ウィンドウのスナップショット取り、操作の成功失敗のログ吐き出し、テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。 以上、よろしくお願いします。

関連するQ&A

  • .NET Frameworkって一体何?

     近年、.NET Frameworkという言葉が流行っていますが、これは一体何なのでしょうか?  従来のようにWin32APIやMFCを使ったアプリケーションとは、かなり質が異なるもののように思われます。  .NET Frameworkに対応したアプリケーション開発ができると、どのような利点が生まれるのでしょうか?  また、次期WindowsといわれるLonghornでは、.NET Frameworkが非常に重要視されているように思います。 そして、こうした時代の流れを察するに、Win32APIやMFCのみでのアプリケーション開発をしてきた私も、.NET Frameworkとは一体何かを知らなければいけないと思うようになりました。  私はまだ何も確証は持てないのですが、.NET Frameworkはコンポーネント技術と何かしら関係があるように思います。しかし、そのような気がするだけで、何がどうなって、.NET Frameworkが構成されているのかまったくわかりません。.NET Frameworkがあると、将来どのようなことが実現可能になるのですか?

  • Edit Conrol(テキストボックス)

    Edit Conrol(テキストボックス)の背景に画像を貼り付けることって可能でしょうか? VisualC++.net 2003 API or MFCでお願いします。

  • 他アプリのアクティブな子ウインドウを取得するには?

    他人の作ったあるフリーソフトがあるのですが、そのソフトには、テキストボックスが2つ存在していて、そのうち、現在キー入力を受け付ける状態にある方のテキストボックスのハンドルを取得したいと思っています。 つまり、アクティブな子ウインドウを取得したいということなのですが、そのようなことは可能でしょうか? 自作ソフトならばなんとか分かるのですが、他人の作ったものでは無理なのでしょうか? APIのGetForegroundWindowでは、トップレベルウインドウしか求めることが出来ないようですし。 よろしくお願い致します。

  • VisualBasic.NETのSendKeyをVisual C++で実現したいのですが。

    VisualBasic.NETでは SendKeys.Send("Hello") を実行すればメモ帳でもインターネットのテキストフレームにでも文字列を送り込むことはできますが、(フォームを隠しておきますが、、、)、 VisualC++ではどのAPI等を使えば、 まったく同じ機能を果たすことができますか? よろしくお願いします。 VisualC++ Win32アプリケーション WindowsXPです。

  • アプリケーションを起動すると、Windowsが自動的に再起動

    WindowsXP搭載のVAIOタワーを使用しています。 最近、アプリケーション(特定のものではなく、ランダムに)を起動しようとすると、なぜか自動的&強制的にWindowsが再起動してしまいます。 この問題がソフトの問題なのか、OSの問題なのか、あるいはハードの問題なのかも分かりません。 このような症状を体験された方、解決策をお願いします。OSの再インストールは、できれば避けたいと思います。よろしくお願いいたしますm(_ _)m。

  • C#のクラスライブラリでメッセージボックスを表示

    VisualStudio2010でVisualC#のクラスライブラリやコンソールアプリケーションでメッセージボックスを表示させたいのですが、 Windowsフォームアプリケーションでは MessageBox.Show("メッセージ本文","タイトル",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); で表示させることができたのですが、 クラスライブラリやコンソールアプリケーションでの中から表示する仕方が分かりません。(OS WindowsXP VisualStudio2010) 1) VisualC#のクラスライブラリでメッセージボックスを表示させるには public class Class1 { }   の中にどのようなコードを記述すればよいのでしょうか。 2) VisualC#のコンソールアプリケーションでメッセージボックスを表示させるには static void Main(string[] args) { }   の中にどのようなコードを記述すればよいのでしょうか。 よろしくお願いします。

  • Windows vistaの標準解凍ソフトは??

    Windows vistaの標準解凍ソフトを使ってzip形式のファイルを解凍しとぃましたが、設定を変えたら、出来なくなってしまいました。標準解凍ソフトは何という名前のアプリケーション?なんでしょうか? 設定の戻し方教えてください。

  • メッセージを他のPCに出したい

    Windows2000orXP+VBAです。 LAN上の他のPCにメッセージを表示させたいと思っています。 表示させるPCには特別なソフトをインストールしたりはせずに、できればWindowsAPI等を使用して 実現させたいと思っているのですが実現できる手法はあるのでしょうか。 ご存知の方がいらっしゃったら使えるAPIの関数名だけでも教えてもらえるとありがたいのですが。 よろしくお願いします。

  • 漢字を入力すると自動的に読み仮名を埋めてくれる

    アプリケーションで、氏名フィールドに漢字を入力すると自動的に読み仮名を入力してくれるようなものを作成したいと思っています。どのようにすればこのようなことが実現可能でしょうか? サードベンダーのソフトウェアを購入しなければならないのでしょうか? それとも何か標準的なAPI、JavaScript等何でもよいのですが用意されているのでしょうか。ソフトウェアを購入するというのでも構いませんので、最もよい方法を教えて頂きたく、宜しくお願いします。 サンプルとなるサイトを下記に引用しておきます。 https://m.sbisec.co.jp/eatiw011 以上、宜しくお願いします。

    • ベストアンサー
    • HTML
  • Windowsに標準で付属してほしいアプリケーションは?

    Windowsに、標準で様々なアプリケーションがインストールされていますが(ペイント、ムービーメーカー)、皆さんは、Windows OSで標準で付属してほしいアプリケーションソフトは、何だと思いますでしょうか? よろしくお願いします。