質問するログイン新規登録

質問編集履歴

5

まとめた

2018/01/22 06:32

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,7 @@
1
+ ###わかったこと
2
+ - Win7の電卓アプリはボタンに絵が表示されていてキャプションは空。
3
+ - WM_GETTEXTは`wstring`型で受けたほうが良い
4
+ - WM_GETTEXTで取得できる文字列は途中に`'\0'`を含むかもしれないので文字列を受ける側の変数にあらかじめWM_GETTEXTLENGTHで文字長を指定するなら取得後に再度文字長を定義したほうが良い
1
5
  ###前提・実現したいこと
2
6
  UIオートメーションを実現するためにテストとして、とりあえずWindowsに標準でインストールされている電卓を操作しようとしています。
3
7
  いま、取得できるハンドラのうちどれがどのボタンか判別ができずにいます。

4

wstringに変更。ウィンドウのボタン上の文字を取得するんだからそりゃstd::stringじゃ力不足よね・・・

2018/01/22 06:32

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -56,10 +56,10 @@
56
56
  if (bufLen > 1) {
57
57
  // std::vector<char> buf[bufLen]; ご指摘を受けて改善
58
58
  // SendMessage(hwnd, WM_GETTEXT, bufLen, (LPARAM)&buf[0]);
59
- std::string buf;
59
+ std::wstring buf; //wstringに変更 std::string buf;
60
60
  buf.resize(bufLen);
61
61
  SendMessage(hwnd, WM_GETTEXT, bufLen, (LPARAM)&buf[0]);
62
- buf.resize(std::char_traits<char>::length(&buf[0]));
62
+ buf.resize(std::char_traits<wchar_t>::length(&buf[0])); //wstringに変更 char>::length(&buf[0]));
63
63
 
64
64
  int hoge = 0; // ブレークポイント設置用の行。 // ここのブレークポイントから先でエラー
65
65
  }

3

感情的な言い回しを是正

2018/01/22 04:41

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,12 +1,10 @@
1
1
  ###前提・実現したいこと
2
2
  UIオートメーションを実現するためにテストとして、とりあえずWindowsに標準でインストールされている電卓を操作しようとしています。
3
3
  いま、取得できるハンドラのうちどれがどのボタンか判別ができずにいます。
4
- ~~ そこで、WM_GETTEXTをGetMessage関数に指定してボタンのキャプションを取得しようしています。
4
+ ~~そこで、WM_GETTEXTをGetMessage関数に指定してボタンのキャプションを取得しようしています。~~
5
- ですが、以下のメッセージが発生しており如何ともならなくなっている状況です。
5
+ ~~ですが、以下のメッセージが発生しており如何ともならなくなっている状況です。~~
6
-
7
- また、どのハンドラーがどのボタンであるかを判断する方法が他にあれば`GetMessage`関数が使えなくとも良いです。
6
+ ~~また、どのハンドラーがどのボタンであるかを判断する方法が他にあれば`GetMessage`関数が使えなくとも良いです。~~
8
- ~~
9
- まったく駄目でした。ボタンのキャプションほとんどが空になっており終端文字`'\0'`しか取得できず何の役にも立ちません。
7
+ ボタンのキャプションを取得して判別しようとしましたがほとんどが空になっており終端文字`'\0'`しか取得できず目的を達成できません。
10
8
  電卓のボタンをそれぞれ特定するために良い方法はないでしょうか?
11
9
 
12
10
  よろしくお願いいたします。

2

キャプションを取る方法で駄目だったので質問内容を修正

2018/01/22 03:43

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,12 +1,17 @@
1
1
  ###前提・実現したいこと
2
2
  UIオートメーションを実現するためにテストとして、とりあえずWindowsに標準でインストールされている電卓を操作しようとしています。
3
3
  いま、取得できるハンドラのうちどれがどのボタンか判別ができずにいます。
4
- そこで、WM_GETTEXTをGetMessage関数に指定してボタンのキャプションを取得しようしています。
4
+ ~~ そこで、WM_GETTEXTをGetMessage関数に指定してボタンのキャプションを取得しようしています。
5
5
  ですが、以下のメッセージが発生しており如何ともならなくなっている状況です。
6
6
 
7
7
  また、どのハンドラーがどのボタンであるかを判断する方法が他にあれば`GetMessage`関数が使えなくとも良いです。
8
+ ~~
9
+ まったく駄目でした。ボタンのキャプションはほとんどが空になっており終端文字`'\0'`しか取得できず何の役にも立ちません。
10
+ 電卓のボタンをそれぞれ特定するために良い方法はないでしょうか?
8
11
 
9
12
  よろしくお願いいたします。
13
+
14
+ **以下は解決しました。**
10
15
  ###発生している問題・エラーメッセージ
11
16
 
12
17
  ```
@@ -51,8 +56,12 @@
51
56
  int bufLen = 0;
52
57
  bufLen = SendMessage(hwnd, WM_GETTEXTLENGTH, NULL, NULL) + 1; // +1は文字末端\0用
53
58
  if (bufLen > 1) {
54
- std::vector<char> buf[bufLen];
59
+ // std::vector<char> buf[bufLen]; ご指摘を受けて改善
60
+ // SendMessage(hwnd, WM_GETTEXT, bufLen, (LPARAM)&buf[0]);
61
+ std::string buf;
62
+ buf.resize(bufLen);
55
63
  SendMessage(hwnd, WM_GETTEXT, bufLen, (LPARAM)&buf[0]);
64
+ buf.resize(std::char_traits<char>::length(&buf[0]));
56
65
 
57
66
  int hoge = 0; // ブレークポイント設置用の行。 // ここのブレークポイントから先でエラー
58
67
  }

1

質問をすこしすっきりさせました

2018/01/22 03:39

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,11 @@
1
1
  ###前提・実現したいこと
2
- UIオートメーションを実現するためにテストとして電卓を操作しようとしています。
2
+ UIオートメーションを実現するためにテストとして、とりあえずWindowsに標準でインストールされている電卓を操作しようとしています。
3
- しかしボタンを特定する事ができなため、取得できるハンドラのうちどれがどのボタンか判別ができずにいます。
3
+ 、取得できるハンドラのうちどれがどのボタンか判別ができずにいます。
4
4
  そこで、WM_GETTEXTをGetMessage関数に指定してボタンのキャプションを取得しようしています。
5
- そのとき、以下のメッセージが発生しました
5
+ ですが、以下のメッセージが発生しており如何ともならなくなっている状況です
6
6
 
7
+ また、どのハンドラーがどのボタンであるかを判断する方法が他にあれば`GetMessage`関数が使えなくとも良いです。
8
+
7
9
  よろしくお願いいたします。
8
10
  ###発生している問題・エラーメッセージ
9
11