アプリ版:「スタンプのみでお礼する」機能のリリースについて

VisualC++で作ったアプリケーションから、例えばWindowsに標準搭載の「電卓アプリケーション」のウィンドウをアクティブにして、さらにその中の「1」ボタンを認識して押す、テキストボックスを認識してそこに文字列を入れるといったソフトを作りたいです。

簡単にいうと、他のアプリケーションを自動的に操作するソフトを作りたいのです。

これを実現するために、Web検索してみましたが、関連する技術の名前やMFCでのAPI名がわからないです。これはどういった名前の技術で、VisualC++でどういった名前の関数を使うのでしょうか?

当方の環境はWindowsXP&VisualC++6.0です。

以上、よろしくお願いします。

A 回答 (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/w …
・上記のような感じで操作できます。
 一番重要なのは操作するウインドウのハンドルを正しく見つけ出すことです。
 このウインドウ・ハンドルを見つけるには次の方法があります。
 (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;
}
以上。
    • good
    • 2
この回答へのお礼

ありがとうございます。

サンプルプログラムを作ってみましたところ、うまく電卓アプリケーションの操作ができました。

また、教えていただいたキーワードを足がかりに、関連する技術用語も検索することができました。

お礼日時:2007/10/14 00:49

★アドバイス


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

この回答への補足

回答ありがとうございます。

私が考えている他のアプリケーションを操作する仕様は

(1)ウィンドウのタイトルバーの名前(例:「電卓」)、またはウィンドウのIDでウィンドウを探す
(2)最初にヒットしたウィンドウをアクティブにする
(3)アクティブにしたウィンドウの中にあるボタンを探す
(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す

といった仕様を考えています。

なぜ、このような質問をしたかというと、フリーウェアによくある操作再生だけではなく、ウィンドウのスナップショット取り、操作の成功失敗のログ吐き出し、テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。

以上、よろしくお願いします。

補足日時:2007/10/10 22:21
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A