WPF ユーザーコントロール

<UserControl x:Class="WpfApplication6.Cell"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        >
    <Grid >
    <Polygon Name="Polygon" Margin="5 5 5 5"
    Points="25,0 75, 0 100,43 75,86 25, 86 0 43"
    Stroke="Purple"
    StrokeThickness="2">
            <Polygon.Fill>
                <SolidColorBrush Color="Red" Opacity="0.8"/>
            </Polygon.Fill>
        </Polygon>

        <Label Name="label1" HorizontalContentAlignment="Center" Margin="6,15,6,0">Label</Label>
        <Label Name="label2" HorizontalContentAlignment="Center" Margin="4,47,8,21" >Label</Label>
    </Grid>

</UserControl>

用途は・・・

Process 情報の取得に関するメモ2

WMI を使用して Process 情報を取得する際に LINQ を使用しようとすると

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();

var query = from proc in queryCollection1 select proc;
foreach (var process in query)
{
   …
}

エラー    1    ソース型 ‘System.Management.ManagementObjectCollection’ のクエリ パターンの実装が見つかりませんでした。’Select’ が見つかりません。範囲変数 ‘proc’ の型を明示的に指定してください。    C:\Users\uchukamen\Documents\Visual Studio 2008\Projects\WpfApplication6\WpfApplication6\Window1.xaml.cs    140    38    WpfApplication6

というエラーになる。

回避方法は、範囲変数 proc の型を明示的に指定するために、queryCollection1.Cast<ManagementObject>()  としてあげるとうまくいった。うむむむむ・・・

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();

var query = from proc in queryCollection1.Cast<ManagementObject>() select proc;
foreach (var process in query)
{
    Console.WriteLine(process["ProcessId"] + ":");
    Console.WriteLine(process["Name"] + ":");
    Console.WriteLine(process["KernelModeTime"] + ":");
    Console.WriteLine(process["UserModeTime"] + ":");
}

——

もうちょっと見やすく?すると、IEnumerable<ManagementObject> にキャストしてくれるということ。

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();
IEnumerable<ManagementObject> procQuery = queryCollection1.Cast<ManagementObject>();

var procs = from proc in procQuery select proc;

foreach (var process in procs)
{
    Console.WriteLine(process["ProcessId"] + ":");
    Console.WriteLine(process["Name"] + ":");
    Console.WriteLine(process["KernelModeTime"] + ":");
    Console.WriteLine(process["UserModeTime"] + ":");
}

Process 情報の取得に関するメモ

Visual Studio 2008 , Vista で、GetProcesses() でプロセス情報を取得する際に、TotalProcessorTime などプロセッサタイムを取得しようとすると、Win32Exception により取得できない。なぜ??

var query = from proc in System.Diagnostics.Process.GetProcesses()
            orderby proc.Id
            select new
            {
                Id = proc.Id,
                processName = proc.ProcessName,
                TotalProcessorTime = proc.TotalProcessorTime
            };

foreach (var process in query)
{
    Console.WriteLine(process.Id + ":");
    Console.WriteLine(process.processName + ":");
    Console.WriteLine(process.TotalProcessorTime + ":");
}

—————–

WMI を使用すれば、取得可能。

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();

foreach (ManagementObject mo in queryCollection1)
{
    Console.WriteLine(mo["ProcessId"] + "\t" + mo["Name"] + "\t" +
        ":\tKernelModeTime=" + mo["KernelModeTime"] +  // in 100 nanosecond units
        ":\tUserModeTime=" + mo["UserModeTime"]);   // in 100 nanosecond units
}

Visual Studio 2010 Parallel – Process

シーケンシャルだと

var query = from proc in System.Diagnostics.Process.GetProcesses() select proc;
foreach (var process in query)
{
    Console.WriteLine(process.Id + " : " + process.ProcessName);
}

これがパラレルだと、

var query = from proc in System.Diagnostics.Process.GetProcesses() select proc;
Parallel.ForEach(query, process =>
    {
        Console.WriteLine(process.Id + " : " + process.ProcessName);
    }
);

処理的には、パラレルでもシーケンシャルでも関係ないので、パラレルで実行しているほうが処理する人の感覚(意図)に近いのかもしれない。

Visual Studio 2010 Parallel

Visual Studio 2010 beta を入れてみた。

image

 

using System.Threading;
using System.Diagnostics;

Stopwatch sw = new Stopwatch();
sw.Start();
Parallel.For(0, 10, x =>
    {
        Console.WriteLine(x.ToString() + " : " + Thread.CurrentThread.ManagedThreadId.ToString());
        Thread.Sleep(5000);
    }
);
sw.Stop();

実行結果

x : ManagedThreadId

————-

0 : 8
5 : 10
1 : 11
6 : 12
2 : 13
7 : 14
3 : 15
4 : 8
8 : 10
9 : 10

こんなことができてしまうなんて・・・

Codeseek 勉強会のWinRing0の資料をアップしました。

第40回codeseek勉強会
「宇宙仮面のWinRing0」
(共催:tk-engineeringこみゅぷらすeパウダ~.Net/C# Group)

開催日:2009年5月19日(火) 19:00~21:00 18:55に6F受付集合
場所:マイクロソフト社新宿オフィス6F会議室
募集締め切り:2009年5月16(土)23時59分59秒
20名まで
参加費無料

Codeseek 勉強会のWinRing0の資料を
http://uchukamen.com/wpf/WinRing0/
にアップしました。

削除できなくなった Gadget を強制的に削除する

いろいろ悪さをしていて、Gadget が消せなくなった場合の対処方法 w

  1. タスクトレイの [Windows サイドバー]を右クリック→終了。
  2. %USERPROFILE%\AppData\Local\Microsoft\Windows SidebarのSettings.ini を削除
  3. スタートメニュー→アクセサリ→Windows サイドバー で再起動。

なお、この場合、サイドバーの設定がすべてリセットされます。

XML Web Service の呼び出し

CPUの温度を取得する際、WebClient を使用した、非同期呼び出し。

なお、Silverlight 3 Beta では、linq がサポートされていないので動かない。

///////////

WebClient client = new WebClient();

string request = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"  xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soap:Body><CPUTemperatureStringResponse xmlns=\"http://tempuri.org/\">      <CPUTemperatureStringResult>float</CPUTemperatureStringResult>    </CPUTemperatureStringResponse></soap:Body></soap:Envelope>";

client.Headers.Add(HttpRequestHeader.ContentType, "text/xml");

client.Headers.Add("SOAPAction", "http://tempuri.org/CPUTemperature");

client.UploadStringCompleted += delegate(Object sender2, UploadStringCompletedEventArgs ev)
{
    XNamespace soap="http://schemas.xmlsoap.org/soap/envelope/";
    XNamespace xsi="http://www.w3.org/2001/XMLSchema-instance";
    XNamespace xsd="http://www.w3.org/2001/XMLSchema";
    XNamespace xst = "http://tempuri.org/";

    XDocument xmlHeadlines = XDocument.Parse(ev.Result);
    var headlines = from story in xmlHeadlines.Descendants(xst + "CPUTemperatureResult") select story;

    string temp = headlines.First().Value;

    TextBox1.Text = temp;
};

client.UploadStringAsync(new Uri("http://localhost/SystemTemperature/Temperature.asmx"), request);

CPUの温度取得に関するメモ6

WinRing0 を利用した Web Service のビルド環境の構築まとめ (Vista 32bit版)

  1. Visual Studio 2008 を管理者モードで起動
  2. ASP.NET Web サービスアプリケーションのプロジェクトを作成
  3. OpenLibSys.cs を追加
  4. WinRing0 は管理者で実行する必要があるため、Web.Config で Administrator に偽装するためのコードを追加
    <configuration>
      <system.web>
        <identity impersonate="true" userName="ホスト名\Administrator" password="パスワード" />
  5. デバッグ環境時の DLL 参照パス C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0 に WinRing0.sys と WinRing0.dll をコピーする。
  6. IIS実行環境時の DLL 参照パス c:\windows\system32\inetsrv に WinRing0.sys と WinRing0.dll をコピーする。