
VisualC++で作ったアプリケーションから、例えばWindowsに標準搭載の「電卓アプリケーション」のウィンドウをアクティブにして、さらにその中の「1」ボタンを認識して押す、テキストボックスを認識してそこに文字列を入れるといったソフトを作りたいです。
簡単にいうと、他のアプリケーションを自動的に操作するソフトを作りたいのです。
これを実現するために、Web検索してみましたが、関連する技術の名前やMFCでのAPI名がわからないです。これはどういった名前の技術で、VisualC++でどういった名前の関数を使うのでしょうか?
当方の環境はWindowsXP&VisualC++6.0です。
以上、よろしくお願いします。
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/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;
}
以上。
ありがとうございます。
サンプルプログラムを作ってみましたところ、うまく電卓アプリケーションの操作ができました。
また、教えていただいたキーワードを足がかりに、関連する技術用語も検索することができました。
No.1
- 回答日時:
★アドバイス
>他のアプリケーションを自動的に操作するソフトを作りたいのです。
↑
操作したいアプリケーションのウインドウ・ハンドルを取得すればいろいろと
操作できます。ここが一番のポイントです。
・例えとして『Windows電卓』の『1』ボタンを押す仕組みは
(1)起動しているであろう『Windows電卓』のウインドウ・ハンドルを取得
(2)トップレベルのウインドウ・ハンドルからコントロールの列挙
(3)列挙されてボタン、テキストボックスなどのキャプションを調べて目的の
コントロール(ボタンなど)のウインドウ・ハンドルを取得
(4)取得したボタンのウインドウ・ハンドルにプログラムから押された指示を出す
こんな感じになります。
・それでどのようにウインドウ・ハンドルを得るかがポイントになります。
まずはどうやって他のアプリケーションを操作するのかの仕様を決めて下さい。
(1)マウスの下にあるウインドウを操作
(2)アクティブ・ウインドウを操作
(3)登録されたウインドウをひそかに操作
(4)その他
どのような仕組みで操作するのでしょうか補足して下さい。
良くフリーソフトなどではキーボードやマウス操作を記録して再生するソフトがあります。
このような仕様ですか?それとも別方式?
・以上。操作の仕様などを補足して下さい。
この回答への補足
回答ありがとうございます。
私が考えている他のアプリケーションを操作する仕様は
(1)ウィンドウのタイトルバーの名前(例:「電卓」)、またはウィンドウのIDでウィンドウを探す
(2)最初にヒットしたウィンドウをアクティブにする
(3)アクティブにしたウィンドウの中にあるボタンを探す
(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す
といった仕様を考えています。
なぜ、このような質問をしたかというと、フリーウェアによくある操作再生だけではなく、ウィンドウのスナップショット取り、操作の成功失敗のログ吐き出し、テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
VB.netでFindWindowExやると・・・9222812402616107008!?
Visual Basic(VBA)
-
別のアプリケーションのテキストフィールドに入力する方法
Visual Basic(VBA)
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
他のアプリケーションとの連携
Visual Basic(VBA)
-
6
他アプリケーション’(ウィンドウ)のハンドル取得方法
Visual Basic(VBA)
-
7
VB.NETのSendMessageを教えてください
Visual Basic(VBA)
-
8
【C#】FindWindowExの使い方を教えてください
その他(プログラミング・Web制作)
-
9
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
10
SendMessage で ESC など
C言語・C++・C#
-
11
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
12
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
13
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
14
他のアプリケーションの操作について
C言語・C++・C#
-
15
他アプリの操作(メニューバー)
Visual Basic(VBA)
-
16
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
17
WinAPIで電卓をクリック
Visual Basic(VBA)
-
18
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
19
他アプリのアクティブな子ウインドウを取得するには?
C言語・C++・C#
-
20
std::stringからLPCWSTR型への変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
VBAでコントロールのハンドルを...
-
VC++(MFC)でタスクバーに常駐し...
-
WM_CLEARなど使えないメッセー...
-
キーボード・フックのアプリを...
-
VB.netでFindWindowExやると・...
-
WM_NCLBUTTONUPについて
-
VC++2008のWindowsフォームでWi...
-
MQプログラミング MQGetの手法...
-
windowsメールスロットについて...
-
メッセージボックスの選択ボタ...
-
directshowのイベント処理
-
メッセージハンドラ
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
コンボボックス内の文字サイズ変更
-
コントロールの書式設定で、“コ...
-
グラフの交点の求め方(Excel)
-
Minecraft 統合版(PC)の描画距...
-
フォントの大きさ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
msgboxの表示位置
-
SendMessage で ESC など
-
VBAでコントロールのハンドルを...
-
SetWindowText関数について
-
VBA 複数セルが空白なら印刷さ...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
-
デスクトップ上のアイコンの位...
-
CloseHandle()
-
メッセージループについて
-
メッセージハンドラ
-
VB.netでSendMessageを使用して...
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
マウスの右クリック+Shiftキー...
-
キーボード・フックのアプリを...
-
windowsメールスロットについて...
おすすめ情報