C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: GetForegroundWindowでエラーが出て


(過去ログ 113 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■66874 / inTopicNo.1)  GetForegroundWindowでエラーが出て
  
□投稿者/ capr (1回)-(2013/06/01(Sat) 00:12:29)

分類:[C#] 

下記のコードでコンパイルが通らなかった理由を知りたいです。
Visual C# 2010 Expressを使っています。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
using System;

[DllImport("user32.dll")]
extern static IntPtr GetForegroundWindow() ;//IntPtrでエラー:クラス、デリゲート、列挙型、インターフェイス または構造体が必要


class ScreenCapture2013_5_30
{
static void Main(string[] args)
{
IntPtr hWnd = GetForegroundWindow();//エラー:'GetForegroundWindow' は現在のコンテキスト内に存在しません
}
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
アクティブウィンドウの画像をキャプチャさせたいので、↓のWebサイトを参考にしました。SendKeysを使ったキャプチャには成功しました。
(参考:http://dobon.net/vb/dotnet/graphics/screencapture.htmlhttp://d.hatena.ne.jp/sensepicker/20091025/1256439647
引用返信 編集キー/
■66875 / inTopicNo.2)  Re[1]: GetForegroundWindowでエラーが出て
□投稿者/ Azulean (172回)-(2013/06/01(Sat) 00:16:22)
エラーがわかりづらいかもしれませんが、C# においては、すべての関数・メソッド・プロパティはクラス、または構造体の中にある必要があります。
このため、クラス・構造体などが出現すべきポイントにいきなり関数が現れたためにコンパイルエラーになっています。

対処法としてはそのクラスの中に宣言を移動してください。
引用返信 編集キー/
■66876 / inTopicNo.3)  Re[2]: GetForegroundWindowでエラーが出て
□投稿者/ capr (3回)-(2013/06/01(Sat) 02:31:48)
ありがとうございます。
以下のコードに書き直したところ、コンパイルが通りました。アクティブウィンドウの画面キャプチャにも成功しました。
using System;
using System.Runtime.InteropServices;
using System.Drawing;

namespace ScreenCapture
{
    class ScreenCapture2013_5_30
    {
        [StructLayout(LayoutKind.Sequential)]//Sequentialレイアウトでは,構造体の要素が順番にメモリに配置される
        private struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        private const int SRCCOPY = 13369376;

        [DllImport("gdi32.dll")]
        private static extern int BitBlt(IntPtr hDestDC,
            int x,
            int y,
            int nWidth,
            int nHeight,
            IntPtr hSrcDC,
            int xSrc,
            int ySrc,
            int dwRop);

        [DllImport("user32.dll")]
        private static extern IntPtr GetDC(IntPtr hwnd);

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        private static extern int GetWindowRect(IntPtr hwnd,
            ref  RECT lpRect);

        [DllImport("user32.dll")]
        private static extern IntPtr GetWindowDC(IntPtr hwnd);

        [DllImport("user32.dll")]
        private static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);

        /// <summary>
        /// アクティブなウィンドウの画像を取得する
        /// </summary>
        /// <returns>アクティブなウィンドウの画像</returns>
        public static Bitmap CaptureActiveWindow()
        {
            //アクティブなウィンドウのデバイスコンテキストを取得
            IntPtr hWnd = GetForegroundWindow();
            IntPtr winDC = GetWindowDC(hWnd);//GetWindowDC:DCデバイスコンテキスト(内部状態)を取得するたびに、既定の属性をウィンドウのDCへ割り当てる
            //ウィンドウの大きさを取得
            RECT winRect = new RECT();
            GetWindowRect(hWnd, ref winRect);
            //Bitmapの作成
            Bitmap bmp = new Bitmap(winRect.right - winRect.left,
                winRect.bottom - winRect.top);
            //Graphicsの作成
            Graphics g = Graphics.FromImage(bmp);
            //Graphicsのデバイスコンテキストを取得
            IntPtr hDC = g.GetHdc();
            //Bitmapに画像をコピーする
            BitBlt(hDC, 0, 0, bmp.Width, bmp.Height,
                winDC, 0, 0, SRCCOPY);
            //解放
            g.ReleaseHdc(hDC);
            g.Dispose();
            ReleaseDC(hWnd, winDC);

            return bmp;
        }

        static void Main(string[] args)
        {
            //画像を作成する
            Bitmap pic = CaptureActiveWindow();

            //PNG形式で保存する
            pic.Save("C:\\Users\\USER\\Downloads\\test.png", System.Drawing.Imaging.ImageFormat.Png);

            //後片付け
            pic.Dispose();
        }
    }
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -