Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

C#からWin32API叩く

$
0
0

P/Invokeもいいですが、C++/CLI経由も個人的に好きです。例えばアクティブなWindowのタイトルを取りたいときとか…。

C++/CLIでこんなクラスを用意しておく。

// CPPCLR.h#pragma once#include "Stdafx.h"#include <Windows.h>#include <tchar.h>usingnamespace System;

namespace CPPCLR {

    public ref class ActiveWindow
    {
    public:
        static String^ GetActiveWindowText()
        {
            GUITHREADINFO info;
            info.cbSize = sizeof(GUITHREADINFO);
            ::GetGUIThreadInfo(NULL, &info);
            WCHAR str[1024];
            ::GetWindowText(info.hwndActive, str, 1024);
            return gcnew String(str);
        }
    };
}

このままだとリンカエラーになるので、プロパティのリンカーの入力にある、追加の依存ファイルを編集して、user32.libとかを追加するようにする。編集画面開いてOK押すだけでよさそう。

C#側は、C++/CLIのプロジェクトを参照して普通に呼び出すだけですね。

privatevoid Window_Loaded(object sender, RoutedEventArgs e)
{
    timer = new DispatcherTimer();
    timer.Tick += (s, args) =>
    {
        info.Text = CPPCLR.ActiveWindow.GetActiveWindowText();
    };
    timer.Start();
}

込み入った値を返すとか、コールバックが必要とかそういうのじゃなければ割とサクッと作れて便利です。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>