質問編集履歴

11

英語なんか嫌いだ

2018/01/30 03:40

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -96,9 +96,7 @@
96
96
 
97
97
 
98
98
 
99
- HWND childHndl;
100
-
101
- ::FindWindowEx( hwnd, childHndl, _T("Edit"),NULL);
99
+ HWND childHndl = ::FindWindowEx( hwnd, NULL, _T("Edit"),NULL);
102
100
 
103
101
  ::SendMessage(childHndl, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
104
102
 

10

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

2018/01/30 03:40

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -96,7 +96,11 @@
96
96
 
97
97
 
98
98
 
99
+ HWND childHndl;
100
+
101
+ ::FindWindowEx( hwnd, childHndl, _T("Edit"),NULL);
102
+
99
- ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
103
+ ::SendMessage(childHndl, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
100
104
 
101
105
  // ※追記 実際にコピペ処理を行いたいアプリに対してはEditに相当するコントロールのハンドラが取得できないために機能しないという意味
102
106
 

9

文章を直しました

2018/01/30 03:38

投稿

notgoodpg
notgoodpg

スコア37

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

8

修正

2018/01/29 06:35

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,9 @@
24
24
 
25
25
 
26
26
 
27
- また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。
27
+ ~~また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。~~
28
+
29
+ 最終的に対象となるEditコントロールを識別できないため`WM_COPY`メッセージを送ってコピーを取得する方法は使えません。
28
30
 
29
31
 
30
32
 
@@ -33,6 +35,10 @@
33
35
  もしくは、キーボードからCtrl+Cを入力する事で実行されるコピーとまったく同じ動作をさせる方法があれば手早く解決できると思います。
34
36
 
35
37
  (手作業でのキーボードからのコピーは有効に動作するからです。またこのことからWM_COPYはCtrl+Cとは別の動作をする命令のようです。)
38
+
39
+
40
+
41
+ 最終的に対象となるアプリケーションはDirectXアプリなどのようなもので、キーボード操作を自動化する方法が最適だと考えています。
36
42
 
37
43
 
38
44
 
@@ -92,7 +98,11 @@
92
98
 
93
99
 
94
100
 
95
- ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない ※追記 実際にコピペ処理を行いたいアプリに対しては機能しないという意味
101
+ ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
102
+
103
+ // ※追記 実際にコピペ処理を行いたいアプリに対してはEditに相当するコントロールのハンドラが取得できないために機能しないという意味
104
+
105
+ // ※指摘より hwndにはEditコントロールのHWNDが必要と判明した。しかし最終的な対象アプリケーションはEditコントロールを識別できないため、今回WM_COPYでは解決しない。
96
106
 
97
107
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
98
108
 

7

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

2018/01/29 06:29

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -76,6 +76,22 @@
76
76
 
77
77
  // 文字列をクリップボードにコピー
78
78
 
79
+
80
+
81
+ // 出来れば
82
+
83
+ // ::keybd_event(VK_CONTROL, 0, 0, 0); // Ctrl押下
84
+
85
+ // ::keybd_event(0x43, 0, 0, 0); // C押下
86
+
87
+ // ::keybd_event(0x43, 0, KEYEVENTF_KEYUP, 0); // C解放
88
+
89
+ // ::keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // Ctrl解放
90
+
91
+      // のような処理は避けたい(取り急ぎこれで実装してますがあまりにも酷い方法なので改善したい)
92
+
93
+
94
+
79
95
  ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない ※追記 実際にコピペ処理を行いたいアプリに対しては機能しないという意味
80
96
 
81
97
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?

6

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

2018/01/29 04:59

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -28,7 +28,13 @@
28
28
 
29
29
 
30
30
 
31
- 上記以外の方法について思い当たるものがあれば教えてください。
31
+ 上記以外の方法について思い当たるものがあればください。
32
+
33
+ もしくは、キーボードからCtrl+Cを入力する事で実行されるコピーとまったく同じ動作をさせる方法があれば手早く解決できると思います。
34
+
35
+ (手作業でのキーボードからのコピーは有効に動作するからです。またこのことからWM_COPYはCtrl+Cとは別の動作をする命令のようです。)
36
+
37
+
32
38
 
33
39
  よろしくお願いいたします。
34
40
 

5

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

2018/01/29 04:40

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  // ハンドラを取得
44
44
 
45
- HWND hwnd = ::FindWindow(_T("無題 - メモ帳"), _T("notepad"));
45
+ HWND hwnd = ::FindWindow(_T("notepad"), _T("無題 - メモ帳"));
46
46
 
47
47
  if (hwnd == NULL)return;
48
48
 

4

WM_COPYが駄目な理由を提示

2018/01/29 04:30

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -4,11 +4,15 @@
4
4
 
5
5
  別アプリケーションで選択中の文字列を取得したい。
6
6
 
7
+
8
+
7
9
  別アプリケーションで選択中の文字列を取得して、出力する処理を行いたいのですが実現できずにいます。
8
10
 
9
11
  今のところクリップボードを介して文字列を取得しようとしていますが
10
12
 
11
13
  コピーが実行されず、クリップボードがからのままだったり手作業でコピーした内容を取得してしまいます。
14
+
15
+
12
16
 
13
17
  Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法やUI Automationを利用する方法は今回以下の理由で使えません。
14
18
 
@@ -19,6 +23,12 @@
19
23
  - 上2つの方法が利用できたとしても選択中の文字列のみ取得する事はできない。
20
24
 
21
25
 
26
+
27
+ また以下のように`WM_COPY`メッセージを`SendMessage`で送る方法も通用しません。
28
+
29
+
30
+
31
+ 上記以外の方法について思い当たるものがあれば教えてください。
22
32
 
23
33
  よろしくお願いいたします。
24
34
 
@@ -60,7 +70,7 @@
60
70
 
61
71
  // 文字列をクリップボードにコピー
62
72
 
63
- ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
73
+ ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない ※追記 実際にコピペ処理を行いたいアプリに対しては機能しないという意味
64
74
 
65
75
  // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
66
76
 

3

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

2018/01/29 04:13

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -60,7 +60,9 @@
60
60
 
61
61
  // 文字列をクリップボードにコピー
62
62
 
63
- ::SendMessage(hwnd, WM_COPY, 0, 0);
63
+ ::SendMessage(hwnd, WM_COPY, 0, 0); // 範囲は選択できてもコピーはされない
64
+
65
+ // Ctrl+C と同じ動作がしたい場合は別のメッセージ?
64
66
 
65
67
  // 文字列をクリップボードから取得
66
68
 

2

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

2018/01/29 03:53

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  いくつか試したうち、(MSDN)[https://msdn.microsoft.com/ja-jp/library/80db3kax.aspx]の方法が核心に迫っているのではないかと思っているのですが
98
98
 
99
- この方法はクリップボードに`"Current selection\r\n"`が格納されてしまいます。(これに関しては私の書き方に間違いがあるのか、MSDNのドキュメントがまったくの役立たずなのか判断しかねています。
99
+ この方法はクリップボードに`"Current selection\r\n"`が格納されてしまいます。
100
100
 
101
101
 
102
102
 

1

言葉足らず名部分を追記

2018/01/29 03:35

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  コピーが実行されず、クリップボードがからのままだったり手作業でコピーした内容を取得してしまいます。
12
12
 
13
- Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法は今回以下の理由で使えません。
13
+ Win32APIを用いクラス名Editをもつウィンドウを探索しTextから内容を取得する方法やUI Automationを利用する方法は今回以下の理由で使えません。
14
14
 
15
15
  - EditBox/Text Boxが複数あると判別不能。(最終的にnotepadとは別のアプリケーションの出力を取得したいため)
16
16