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)
-
他アプリケーション’(ウィンドウ)のハンドル取得方法
Visual Basic(VBA)
-
ボタンのハンドルウィンド取得について
C言語・C++・C#
-
-
4
他アプリの操作(メニューバー)
Visual Basic(VBA)
-
5
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
-
6
他のアプリケーションとの連携
Visual Basic(VBA)
-
7
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
8
WSH or VBの質問
Visual Basic(VBA)
-
9
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
10
VB.netでFindWindowExやると・・・9222812402616107008!?
Visual Basic(VBA)
-
11
WinAPIで電卓をクリック
Visual Basic(VBA)
-
12
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
13
c#で他のアプリの文字入力フォームに指定の文字を入力したい
C言語・C++・C#
-
14
ウインドウハンドルのつかみ方について質問です。
Visual Basic(VBA)
-
15
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
16
charからLPTSTRへの変換方法
C言語・C++・C#
-
17
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
18
MFC ダイアログ上のID取得について
C言語・C++・C#
-
19
VB.NETのSendMessageを教えてください
Visual Basic(VBA)
-
20
VB.NETで子ウィンドウの列挙の仕方がわかりません。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
windows終了時のメッセージにつ...
-
メッセージハンドラ
-
msgboxの表示位置
-
SetWindowText関数について
-
マウスフックについて
-
VC++2005 OnCmdMsgでメッセージ...
-
メッセージループについて
-
Excel VBA で外部アプリケーシ...
-
デスクトップ上のアイコンの位...
-
windowsメールスロットについて...
-
PCのシャットダウン処理
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
VBAのフォント変更(エクセルか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
SendMessage で ESC など
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowsHookEx(グローバル...
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_NCLBUTTONUPについて
-
VBでRegisterWindowMessage関数...
-
システム例外のメッセージを変...
-
アプリケーション間での操作
-
マウスホイールをフックしたい
おすすめ情報