回答編集履歴

2

追記

2019/09/12 07:12

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -51,3 +51,91 @@
51
51
  結果:
52
52
 
53
53
  ![イメージ説明](18604cfc62928fa30ef21d9cb2104d6f.png)
54
+
55
+
56
+
57
+ ----
58
+
59
+ 追記
60
+
61
+
62
+
63
+ 上記コードではDPI仮想化環境ではうまく動作しないようです。
64
+
65
+ [フォームやコントロールの外観をキャプチャする](https://dobon.net/vb/dotnet/graphics/invokepaint.html)
66
+
67
+ に他のやり方もいろいろ載っていました。
68
+
69
+
70
+
71
+ 以下のコードでしたらDPI仮想化環境下でもOKでした。
72
+
73
+
74
+
75
+ ```csharp
76
+
77
+ [System.Runtime.InteropServices.DllImport("User32.dll")]
78
+
79
+ private extern static bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
80
+
81
+
82
+
83
+ /// <summary>
84
+
85
+ /// コントロールのイメージを取得する
86
+
87
+ /// </summary>
88
+
89
+ /// <param name="ctrl">キャプチャするコントロール</param>
90
+
91
+ /// <returns>取得できたイメージ</returns>
92
+
93
+ public Bitmap CaptureControl(Control ctrl)
94
+
95
+ {
96
+
97
+ Bitmap img = new Bitmap(ctrl.Width, ctrl.Height);
98
+
99
+ Graphics memg = Graphics.FromImage(img);
100
+
101
+ IntPtr dc = memg.GetHdc();
102
+
103
+ PrintWindow(ctrl.Handle, dc, 0);
104
+
105
+ memg.ReleaseHdc(dc);
106
+
107
+ memg.Dispose();
108
+
109
+ return img;
110
+
111
+ }
112
+
113
+
114
+
115
+ private void toolStripButton1_Click(object sender, EventArgs e)
116
+
117
+ {
118
+
119
+ //コントロールの外観を描画するBitmapの作成
120
+
121
+ using (var bmp = CaptureControl(frm))
122
+
123
+ {
124
+
125
+ // ビットマップ画像として保存して表示
126
+
127
+ string filePath = @"C:\screen.bmp";
128
+
129
+ bmp.Save(filePath, ImageFormat.Bmp);
130
+
131
+ Process.Start(filePath);
132
+
133
+ }
134
+
135
+ }
136
+
137
+ ```
138
+
139
+
140
+
141
+ すでにクローズしちゃってましたが、一応動きましたという報告だけ。

1

こうかな

2019/09/12 07:12

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -1,17 +1,53 @@
1
- 具体的にどこをキャプチャたいの判りませんが
1
+ しかしてこうですかね?
2
2
 
3
3
 
4
4
 
5
+ ```csharp
6
+
7
+ private void toolStripButton1_Click(object sender, EventArgs e)
8
+
9
+ {
10
+
11
+ // スクリーン・キャプチャする範囲を子ウィンドウにする
12
+
5
- > rc = frm.Bounds;
13
+ Rectangle rc = frm.Bounds;
6
14
 
7
15
 
8
16
 
9
-
17
+ // 子ウィンドウの座標をクライアント座標→スクリーン座標に変換
18
+
19
+ Rectangle rcSrc = frm.Parent.RectangleToScreen(rc);
10
20
 
11
21
 
12
22
 
23
+ // Bitmapオブジェクトにスクリーン・キャプチャ
24
+
25
+ using (var bmp = new Bitmap(rcSrc.Width, rcSrc.Height, PixelFormat.Format32bppArgb))
26
+
13
- > rc = frm.ClientRectangle;
27
+ using (var g = Graphics.FromImage(bmp))
28
+
29
+ {
30
+
31
+ g.CopyFromScreen(rcSrc.X, rcSrc.Y, 0, 0, frm.Size, CopyPixelOperation.SourceCopy);
14
32
 
15
33
 
16
34
 
35
+ // ビットマップ画像として保存して表示
36
+
37
+ string filePath = @"C:\screen.bmp";
38
+
39
+ bmp.Save(filePath, ImageFormat.Bmp);
40
+
17
- じゃないでしょうかね。
41
+ Process.Start(filePath);
42
+
43
+ }
44
+
45
+ }
46
+
47
+ ```
48
+
49
+
50
+
51
+ 結果:
52
+
53
+ ![イメージ説明](18604cfc62928fa30ef21d9cb2104d6f.png)