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

質問編集履歴

11

英語なんか嫌いだ

2018/01/30 03:40

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -47,8 +47,7 @@
47
47
  // ::keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // Ctrl解放
48
48
       // のような処理は避けたい(取り急ぎこれで実装してますがあまりにも酷い方法なので改善したい)
49
49
 
50
- HWND childHndl;
51
- ::FindWindowEx( hwnd, childHndl, _T("Edit"),NULL);
50
+ HWND childHndl = ::FindWindowEx( hwnd, NULL, _T("Edit"),NULL);
52
51
  ::SendMessage(childHndl, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
53
52
  // ※追記 実際にコピペ処理を行いたいアプリに対してはEditに相当するコントロールのハンドラが取得できないために機能しないという意味
54
53
  // ※指摘より hwndにはEditコントロールのHWNDが必要と判明した。しかし最終的な対象アプリケーションはEditコントロールを識別できないため、今回WM_COPYでは解決しない。

10

気持ち悪いのでnotepadではきちんとコピーできるようにソースを修正

2018/01/30 03:40

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -47,7 +47,9 @@
47
47
  // ::keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // Ctrl解放
48
48
       // のような処理は避けたい(取り急ぎこれで実装してますがあまりにも酷い方法なので改善したい)
49
49
 
50
+ HWND childHndl;
51
+ ::FindWindowEx( hwnd, childHndl, _T("Edit"),NULL);
50
- ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
52
+ ::SendMessage(childHndl, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
51
53
  // ※追記 実際にコピペ処理を行いたいアプリに対してはEditに相当するコントロールのハンドラが取得できないために機能しないという意味
52
54
  // ※指摘より hwndにはEditコントロールのHWNDが必要と判明した。しかし最終的な対象アプリケーションはEditコントロールを識別できないため、今回WM_COPYでは解決しない。
53
55
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?

9

文章を直しました

2018/01/30 03:38

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -7,21 +7,20 @@
7
7
  コピーが実行されず、クリップボードがからのままだったり手作業でコピーした内容を取得してしまいます。
8
8
 
9
9
  Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法やUI Automationを利用する方法は今回以下の理由で使えません。
10
- - EditBox/Text Boxが複数あると判別不能。(最終的にnotepadとは別のアプリケーションの出力を取得したいため)
10
+ - EditBox/Text Boxが複数あると判別不能。
11
+ - 最終的にnotepadとは別のアプリケーションの出力を取得したいがそのアプリは`Win32API`とは別のモノでSPI++やInspectでも中を覗き見る事が出来ない。
11
- - ウィンドウの中身が`Win32API`とは別のモノになっているようでSPI++やInspectでも覗き見る事が出来ない。(仮にInspectからAutomationIdを取得できてもAutomationIdからAutomationElementを取得する方法が不明)
12
+ __(仮にInspectからAutomationIdを取得できてもAutomationIdからAutomationElementを取得する方法が不明)__
12
- - 上2つの方法が利用できたとしても選択中の文字列のみ取得する事はできない。
13
13
 
14
14
  ~~また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。~~
15
- 最終的に対象となるEditコントロールを識別できないため`WM_COPY`メッセージを送ってコピーを取得する方法使えません。
15
+ 最終的に対象となるEditコントロールを識別できないため`WM_COPY`メッセージを送ってコピーを取得する方法使えません。
16
16
 
17
- 上記の方法について思い当たるものがあればご教授ください。
17
+ 条件からコピー処理を実行する方法思い当たるものがあればご教授ください。
18
18
  もしくは、キーボードからCtrl+Cを入力する事で実行されるコピーとまったく同じ動作をさせる方法があれば手早く解決できると思います。
19
- (手作業でのキーボードからのコピーは有効に動作するからです。またこのことからWM_COPYはCtrl+Cとは別の動作をする命令のようです。)
20
19
 
21
20
  最終的に対象となるアプリケーションはDirectXアプリなどのようなもので、キーボード操作を自動化する方法が最適だと考えています。
22
21
 
23
22
  よろしくお願いいたします。
24
-
23
+ // 文章を直しました
25
24
  ### 該当のソースコード
26
25
 
27
26
  ```c++

8

修正

2018/01/29 06:35

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -11,12 +11,15 @@
11
11
  - ウィンドウの中身が`Win32API`とは別のモノになっているようでSPI++やInspectでも覗き見る事が出来ない。(仮にInspectからAutomationIdを取得できてもAutomationIdからAutomationElementを取得する方法が不明)
12
12
  - 上2つの方法が利用できたとしても選択中の文字列のみ取得する事はできない。
13
13
 
14
- また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。
14
+ ~~また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。~~
15
+ 最終的に対象となるEditコントロールを識別できないため`WM_COPY`メッセージを送ってコピーを取得する方法は使えません。
15
16
 
16
17
  上記以外の方法について思い当たるものがあればご教授ください。
17
18
  もしくは、キーボードからCtrl+Cを入力する事で実行されるコピーとまったく同じ動作をさせる方法があれば手早く解決できると思います。
18
19
  (手作業でのキーボードからのコピーは有効に動作するからです。またこのことからWM_COPYはCtrl+Cとは別の動作をする命令のようです。)
19
20
 
21
+ 最終的に対象となるアプリケーションはDirectXアプリなどのようなもので、キーボード操作を自動化する方法が最適だと考えています。
22
+
20
23
  よろしくお願いいたします。
21
24
 
22
25
  ### 該当のソースコード
@@ -45,7 +48,9 @@
45
48
  // ::keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // Ctrl解放
46
49
       // のような処理は避けたい(取り急ぎこれで実装してますがあまりにも酷い方法なので改善したい)
47
50
 
48
- ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない ※追記 実際にコピペ処理を行いたいアプリに対しては機能しないという意味
51
+ ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
52
+ // ※追記 実際にコピペ処理を行いたいアプリに対してはEditに相当するコントロールのハンドラが取得できないために機能しないという意味
53
+ // ※指摘より hwndにはEditコントロールのHWNDが必要と判明した。しかし最終的な対象アプリケーションはEditコントロールを識別できないため、今回WM_COPYでは解決しない。
49
54
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
50
55
  // 文字列をクリップボードから取得
51
56
  if( !::OpenClipboard(hwnd)) return FALSE;

7

// TERRIBLE HORRIBLE NO GOOD VERY BAD HACK とコメントがつきそうな方法で逃げた場合のコードを追記

2018/01/29 06:29

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -37,6 +37,14 @@
37
37
 
38
38
  std::stringstream ss;
39
39
  // 文字列をクリップボードにコピー
40
+
41
+ // 出来れば
42
+ // ::keybd_event(VK_CONTROL, 0, 0, 0); // Ctrl押下
43
+ // ::keybd_event(0x43, 0, 0, 0); // C押下
44
+ // ::keybd_event(0x43, 0, KEYEVENTF_KEYUP, 0); // C解放
45
+ // ::keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // Ctrl解放
46
+      // のような処理は避けたい(取り急ぎこれで実装してますがあまりにも酷い方法なので改善したい)
47
+
40
48
  ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない ※追記 実際にコピペ処理を行いたいアプリに対しては機能しないという意味
41
49
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
42
50
  // 文字列をクリップボードから取得

6

より目的に近い書き方を目指した

2018/01/29 04:59

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -13,7 +13,10 @@
13
13
 
14
14
  また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。
15
15
 
16
- 上記以外の方法について思い当たるものがあれば教えてください。
16
+ 上記以外の方法について思い当たるものがあればください。
17
+ もしくは、キーボードからCtrl+Cを入力する事で実行されるコピーとまったく同じ動作をさせる方法があれば手早く解決できると思います。
18
+ (手作業でのキーボードからのコピーは有効に動作するからです。またこのことからWM_COPYはCtrl+Cとは別の動作をする命令のようです。)
19
+
17
20
  よろしくお願いいたします。
18
21
 
19
22
  ### 該当のソースコード

5

引数が逆になっている関数を修正

2018/01/29 04:40

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  ```c++
22
22
  // ハンドラを取得
23
- HWND hwnd = ::FindWindow(_T("無題 - メモ帳"), _T("notepad"));
23
+ HWND hwnd = ::FindWindow(_T("notepad"), _T("無題 - メモ帳"));
24
24
  if (hwnd == NULL)return;
25
25
 
26
26
  ::SetForegroundWindow(hwnd);

4

WM_COPYが駄目な理由を提示

2018/01/29 04:30

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,14 +1,19 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  別アプリケーションで選択中の文字列を取得したい。
4
+
4
5
  別アプリケーションで選択中の文字列を取得して、出力する処理を行いたいのですが実現できずにいます。
5
6
  今のところクリップボードを介して文字列を取得しようとしていますが
6
7
  コピーが実行されず、クリップボードがからのままだったり手作業でコピーした内容を取得してしまいます。
8
+
7
9
  Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法やUI Automationを利用する方法は今回以下の理由で使えません。
8
10
  - EditBox/Text Boxが複数あると判別不能。(最終的にnotepadとは別のアプリケーションの出力を取得したいため)
9
11
  - ウィンドウの中身が`Win32API`とは別のモノになっているようでSPI++やInspectでも覗き見る事が出来ない。(仮にInspectからAutomationIdを取得できてもAutomationIdからAutomationElementを取得する方法が不明)
10
12
  - 上2つの方法が利用できたとしても選択中の文字列のみ取得する事はできない。
11
13
 
14
+ また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。
15
+
16
+ 上記以外の方法について思い当たるものがあれば教えてください。
12
17
  よろしくお願いいたします。
13
18
 
14
19
  ### 該当のソースコード
@@ -29,7 +34,7 @@
29
34
 
30
35
  std::stringstream ss;
31
36
  // 文字列をクリップボードにコピー
32
- ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
37
+ ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない ※追記 実際にコピペ処理を行いたいアプリに対しては機能しないという意味
33
38
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
34
39
  // 文字列をクリップボードから取得
35
40
  if( !::OpenClipboard(hwnd)) return FALSE;

3

ソースコードにコメント追加

2018/01/29 04:13

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -29,7 +29,8 @@
29
29
 
30
30
  std::stringstream ss;
31
31
  // 文字列をクリップボードにコピー
32
- ::SendMessage(hwnd, WM_COPY, 0, 0);
32
+ ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
33
+ // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
33
34
  // 文字列をクリップボードから取得
34
35
  if( !::OpenClipboard(hwnd)) return FALSE;
35
36
  HANDLE hData = ::GetClipboardData(CF_TEXT);

2

自動翻訳で意味不明になった記事に「まったくの役立たず」はあまりにも酷なので消した

2018/01/29 03:53

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -47,7 +47,7 @@
47
47
 
48
48
  ### 試したこと
49
49
  いくつか試したうち、(MSDN)[https://msdn.microsoft.com/ja-jp/library/80db3kax.aspx]の方法が核心に迫っているのではないかと思っているのですが
50
- この方法はクリップボードに`"Current selection\r\n"`が格納されてしまいます。(これに関しては私の書き方に間違いがあるのか、MSDNのドキュメントがまったくの役立たずなのか判断しかねています。
50
+ この方法はクリップボードに`"Current selection\r\n"`が格納されてしまいます。
51
51
 
52
52
  ### 補足情報(FW/ツールのバージョンなど)
53
53
  - Windows7/64bit SP1 (表示スタイルはデフォルトでエアロが有効になっています

1

言葉足らず名部分を追記

2018/01/29 03:35

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
  別アプリケーションで選択中の文字列を取得して、出力する処理を行いたいのですが実現できずにいます。
5
5
  今のところクリップボードを介して文字列を取得しようとしていますが
6
6
  コピーが実行されず、クリップボードがからのままだったり手作業でコピーした内容を取得してしまいます。
7
- Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法は今回以下の理由で使えません。
7
+ Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法やUI Automationを利用する方法は今回以下の理由で使えません。
8
8
  - EditBox/Text Boxが複数あると判別不能。(最終的にnotepadとは別のアプリケーションの出力を取得したいため)
9
9
  - ウィンドウの中身が`Win32API`とは別のモノになっているようでSPI++やInspectでも覗き見る事が出来ない。(仮にInspectからAutomationIdを取得できてもAutomationIdからAutomationElementを取得する方法が不明)
10
10
  - 上2つの方法が利用できたとしても選択中の文字列のみ取得する事はできない。