質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

8027閲覧

C/C++から他のソフトの操作

BeatStar

総合スコア4958

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/07/03 04:10

C/C++ ( Windows API実装 ) でやっています。(趣味で。)

Craving Explorer というソフトを自分が組んだプログラムから操作したいと思っています。

「Windows API 他のソフト 操作」と検索したところ、
自分のコントロールを操作するように、
コントロールのハンドルを取得すればいい。
ということがわかりました。

SPY++ というソフトで コントロールのハンドルやらメッセージやらが取得できるということですが、
私は MinGW でやっているので使えません。 ( VC++についているようです。 )

それに近いソフトということで
WinspectorU というソフトで覗いてみました。

これで取得したハンドルに SendMessageで WM_SETTEXT 等のメッセージを送っても...
となぜかイマイチ...

...と色々思いつく範囲のものを試していて、
「どこのウィンドウ(または プロパティシートみたいなコントロール)に張り付いているか」という親ウィンドウハンドルからたどって取得すると、
EDITやCOMBOBOXはなんとかできました。

問題はここからなのです。

質問は複数あります。

( "問題"とはいっても、"課題" の意味じゃないですよ? )

問題1.
試した方法では FindWindow関数で CravingExplorerのハンドルを取得し、FindWindowEx関数でその子ウィンドウ ( コントロール ) を取得していきます。
このとき、
HWND hChild = FindWindowEx( 親ウィンドウハンドル, 0, クラス名, NULL );
となると思いますが、
クラス名が同じで 同じウィンドウ ( コントロール ) に張り付いている場合 ( つまり候補が複数ある場合 )は
どのように取得すべきなのでしょうか?
( 私がやった範囲では 知りたいコントロールが先に来ていたので問題なかったですが。 )

問題2.
Firefox等で言うところの"検索窓" や "URL用" に文字列をセットして後に、手動でやった場合 ( 普通に使った場合 ),
Enterキー か "検索" ボタン的なものを押す 等で 次へ進ませますよね。
このボタンを押す操作だけでも問題ですが、
CE ( CravingExplorer ) の場合は "ツールバー" のようです。
このツールバーを押す操作がどうしてもできません...

私は行きあったりばったりでやっているので、
どうやったか忘れました( 1時間もたってないのに... ) が、

C++

1 EnumWindowsEx::ENUMWINDOW ReBarWindow32, AfxWnd140u1, AfxWnd140u2, ComboBox32, ToolBar; 2 3 // コントールの流れ的には 4 // mainWindow -> ReBar -> AfxWnd140u -> AfxWnd140u -> ComboBox32 となっているようです。 5 6 string sss = "hello"; 7 8 CravingExplorer.hWnd = FindWindow( "CravingExplorerWindowClass", NULL ); 9 if( CravingExplorer.hWnd == NULL ){ return 1; } 10 11 MsgBox->Show( "Found1" ); 12 13 ReBarWindow32.hWnd = FindWindowEx( CravingExplorer.hWnd, 0, "ReBarWindow32", NULL ); 14 if( ReBarWindow32.hWnd == NULL ){ return 1; } 15 16 MsgBox->Show( "Found2" ); 17 18 AfxWnd140u1.hWnd = FindWindowEx( ReBarWindow32.hWnd, 0, "AfxWnd140u", NULL ); 19 if( AfxWnd140u1.hWnd == NULL ){ return 1; } 20 21 MsgBox->Show( "Found3" ); 22 23 AfxWnd140u2.hWnd = FindWindowEx( AfxWnd140u1.hWnd, 0, "AfxWnd140u", NULL ); 24 if( AfxWnd140u2.hWnd == NULL ){ return 1; } 25 26 MsgBox->Show( "Found4" ); 27 28 ComboBox32.hWnd = FindWindowEx( AfxWnd140u2.hWnd, 0, "ComboBoxEx32", NULL ); 29 if( ComboBox32.hWnd == NULL ){ return 1; } 30 31 MsgBox->Show( "Found5" ); 32 33 //ToolBar.hWnd = FindWindowEx( AfxWnd140u2.hWnd, 0, "ToolbarWindow32", NULL ); 34 //if( ToolBar.hWnd == NULL ){ return 1; } 35 36 ToolBar.hWnd = FindWindowEx( AfxWnd140u1.hWnd, 0, "AfxWnd140u", NULL ); 37 if( ToolBar.hWnd == NULL ){ return 1; } 38 39 SendMessage( ComboBox32.hWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)sss.c_str() ); 40 // SendMessage( CravingExplorer.hWnd, WM_ACTIVATE, 0, (LPARAM)ToolBar.hWnd ); 41 SendMessage( AfxWnd140u2.hWnd, WM_COMMAND, (WPARAM)GetWindowLongPtr( ToolBar.hWnd, GWLP_ID ), 0 );

を WM_CREATE のところで行っています。

EnumWindowsEx::ENUMWINDOW は構造体で、

C++

1namespace EnumWindowsEx{ 2 struct ENUMWINDOW{ 3 HWND hWnd; 4 std::string classname; // クラス名 5 std::string title; // キャプション 6 } 7}

で、流用して使っているとします。

私が行いたい処理は、

  1. EDITかCOMBOBOXにあたる 検索窓? に URLなり、キーワードなりをセット
  2. 1でセットした直後、ボタン( ツールバー? ) を押した状態にして、検索結果を表示させる

という感じです。

書きこむデータは自分のウィンドウが行うとします。 ( EDIT とかで入力させる。 今はメッセージが送れないと無理なのでテストするために、文字列を固定するとします。 )

自作あぷりからAPIで他のあぷりをいじるときのめも。(1/4)

を参考にして組んでみました。

ツールバーがどうやればいいのか分からなかったので、
「Windows API 他のソフト ツールバー」で検索したところ、

[ 677_他のアプリの TToobar のボタンをクリック ] - Mr.XRAY

がヒットしました。

これを参考にやってみましたが、
型が(Delphi)オリジナルになっているようで、
そのままでは使えませんでした。

どのようにすればいいのでしょうか?

メッセージを送りつけるといっても、メッセージをpeepしたらものすごい勢いで流れて
どれがどれなのかが判断できない... ( on "WinspectorU" )

一応頑張れば(調べながら)使える言語:
Java
VBA
JavaScript

[情報]
言語: C/C++ ( Windows API 実装 )
コンパイラ: MinGW
頑張れば読める言語: VBA, Java, JavaScript

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Spy++はCommunity Editionにも入っていると思います。
趣味で使うのであれば使用できます。

問題1.
EnumChildWindows
EnumWindows
を使ってください。

問題2.

このツールバーを押す操作がどうしてもできません...

WM_LBUTTONDOWN,WM_LBUTTONUPはどうでしょうか?

メッセージを送りつけるといっても、メッセージをpeepしたらものすごい勢いで流れて
どれがどれなのかが判断できない... ( on "WinspectorU" )

地道に確認するしかありません。
Spy++では不要なメッセージをフィルタリングして排除できるのでそれで調べます。

投稿2017/07/06 11:57

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2017/07/08 04:44

試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問