
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(パソコン・スマホ・電化製品) 学校からGitHubのアカウントを作って事前学習として動画を見て、動画の通りに操作していたら、アカウ 4 2023/04/16 11:44
- オンラインゲーム pc版fall guysでプロコンが反応しなくなりました。windowsです。プロコンをusb接続す 1 2023/02/14 17:33
このQ&Aを見た人はこんなQ&Aも見ています
-
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
VB.netでFindWindowExやると・・・9222812402616107008!?
Visual Basic(VBA)
-
他アプリケーション’(ウィンドウ)のハンドル取得方法
Visual Basic(VBA)
-
-
4
別のアプリケーションのテキストフィールドに入力する方法
Visual Basic(VBA)
-
5
【C#】FindWindowExの使い方を教えてください
その他(プログラミング・Web制作)
-
6
画面を強制的に再描画させる方法
C言語・C++・C#
-
7
VB.NETのSendMessageを教えてください
Visual Basic(VBA)
-
8
SendMessage で ESC など
C言語・C++・C#
-
9
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
10
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
11
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
12
他のアプリケーションとの連携
Visual Basic(VBA)
-
13
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
14
他アプリの操作(メニューバー)
Visual Basic(VBA)
-
15
他のアプリケーションの操作について
C言語・C++・C#
-
16
CString から LPCTSTRの型に変換
C言語・C++・C#
-
17
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
18
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
19
C#で自分のウインド・ハンドルを取得するにはどうすればよいのでしょうか
C言語・C++・C#
-
20
他アプリのアクティブな子ウインドウを取得するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスでコンテキス...
-
タスクバーの並び替え
-
VB.netでFindWindowExやると・...
-
Buffer overrun, data ..
-
マウスフックについて
-
マウスの左クリックの内容を知...
-
DLL VB Wheel ホイール
-
マウスホイールをフックしたい
-
WINDOWを最前面に出したい!!
-
vbaから他のアプリを終了
-
グローバルフックについて
-
モーダルウインドウとモードレ...
-
MQプログラミング MQGetの手法...
-
キーボード・フックのアプリを...
-
HTMLの書換方法を教えてください。
-
メッセージハンドラ
-
MFC利用/WinMainCRTStartup
-
ウィンドウプロシージャの書き...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
msgboxの表示位置
-
SendMessage で ESC など
-
VBAでコントロールのハンドルを...
-
SetWindowText関数について
-
VBA 複数セルが空白なら印刷さ...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
-
デスクトップ上のアイコンの位...
-
CloseHandle()
-
メッセージループについて
-
メッセージハンドラ
-
VB.netでSendMessageを使用して...
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
マウスの右クリック+Shiftキー...
-
キーボード・フックのアプリを...
-
windowsメールスロットについて...
おすすめ情報