やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

Windows10 + WPF でタッチ フィードバックを無効化する(※)

Windows10 上のWPF アプリケーションでタッチ フィードバックを無効化する方法にいてメモ

※まず最初に、この記事で紹介する方法はあるパターン(後述)に対応できていません。
 そのパターンでの対応方法が見つかれば追記 or あらたに記事を書きます。

タッチ フィードバックとは?

Windows8 以降(?)に登場したタッチパネル向けの視覚的表現です。
下の白い円状のインジケータがそれです。
f:id:iyemon018:20170525223659p:plain

このタッチ フィードバックは、以下の設定で表現のレベルを変更することができます。
[Windowsの設定] - [簡単操作] - [その他のオプション] - [タッチ フィードバック]
f:id:iyemon018:20170525224213p:plain

or
[コントロールパネル] - [ペンとタッチ] - [タッチ]
f:id:iyemon018:20170525224224p:plain

この設定は同期しているのでどちらかを変更すればもう片方も変わります。

無効化するには

上記の設定をOFFにすればデスクトップやエクスプローラ、ブラウザなどを操作している感じでは、無効化することができます。
ただし、独自に作成したWPFなどのアプリケーションは、この設定の影響を受けないようです。
Visual Studioもこの影響を受けません。
(UWPならこの設定の影響を受けるのかもしれませんが未検証です。)

ということでタッチ フィードバックを無効化する方法について色々調べてみた結果、完成したコードがこちら↓↓↓

続きを読む

Windows10でエッジ スワイプUI を無効化する方法

teratail にも質問したんですが、
teratail.com
結局回答が無かったので自力で調べました。

エッジ スワイプってなぁにって言うと、タブレットなどでディスプレイの端から中央に向かってスワイプする操作のことです。
以下のページでアクションセンターを表示する例が記載されているのでこちらを見るとわかりやすいかなと。
surface.jp.net

このエッジ スワイプによって表示されるシステムUI のことを"エッジ スワイプUI"と呼ぶらしい(?)です。

今回、タブレットのようにタッチ操作が可能なアプリケーションを作っていました。
フルスクリーンで常に最前面で表示されてほしかったのですが、上記のエッジ スワイプUI が表示されてしまってどうしようかな~?と悩んだ結果質問を投げてみました。

とりあえず、色々調べた結果、以下の方法でエッジ スワイプUI を無効化することができることが分かりました。
winintro.com

一つ注意点として、通常上記の値はレジストリ上にはありません。
多分 HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows に"EdgeUI" が無いと思います。(私の開発PCではありませんでした。)
この値がなければエッジ スワイプUI は有効になります。
つまり、無効化するにはレジストリの値を新規追加する必要があります。
また、レジストリの値の書き換えなので、OSを再起動するまで反映されません。
もとに戻す場合も同様です。

(2017年8月28日追記)
エッジ スワイプUIは、どうやらWindows10 のVer.1511 では無効化できないようです。
現在のところ、Ver.1607/1703 では無効化が可能であることを確認しています。

Setupインストーラーでインストール後に再起動する方法

デスクトップアプリでインストーラーからインストールが完了した後にOSを再起動する方法についてメモします。

動作環境

下準備

  1. Visual Studio拡張機能であるインストーラープロジェクトを追加します。Microsoft Visual Studio 2015 Installer Projects - Visual Studio Marketplace
  2. MSIデータ テーブル編集ツールのOrca をインストールします。

Orcaについては、以下を参照してください。
https://support.microsoft.com/ja-jp/help/255905/how-to-use-the-orca-database-editor-to-edit-windows-installer-files

OrcaWindows SDK に含まれています。が、Windows 7 向けのSDK にしかインストールされていないので別途Windows 7 SDK をインストールする必要があります。
Download Microsoft Windows SDK for Windows 7 and .NET Framework 4 from Official Microsoft Download Center

OrcaSDK の以下のパスに保存されています。
(環境によってはパスが違うかもしれません。)
%Program Files%\Microsoft SDKs\Windows\v7.0A\Bin\Orca.Msi

これをインストールすれば準備OKです。

再起動の設定

まずは、通常通りインストーラー プロジェクトをビルドして、"Setup.exe"と"*.msi"を作成します。
次に、Orca を起動して、作成したMSI ファイルを開きます。
画面左部の[Table]から"Property"を選択すると、MSI ファイルのプロパティの一覧が表示されます。
ここで右クリック - [Add Row] を選択し、以下の内容を入力します。
f:id:iyemon018:20170420174328j:plain

f:id:iyemon018:20170420174428j:plain

"REBOOT"プロパティの値については以下のページを参照してください。
REBOOT property (Windows)

後はMSI ファイルを上書きすれば完了です。

インストールが完了すると、以下のメッセージが表示され、[はい]ボタンをクリックするとOSが再起動されるようになります。
f:id:iyemon018:20170420174841j:plain

Windows Forms のChart を使う~StripLine:グラフの装飾~

Windows Forms で、StripLine を使うと色々便利だったのでメモ。

StripLineってなに?

MSDN StripLineより抜粋

ストリップ ラインは、標準またはカスタムの間隔でグラフの背景に影を付ける水平または垂直の範囲です。 ストリップ ラインを使用することができます。
 ・グラフ上の個々 の値を検索するためには、読みやすさを向上します。
 ・グラフをわかりやすくときは、データ ポイントを分割します。
 ・一定間隔で実行する日付を強調表示、たとえば、週末のデータを識別するために参照します。
 ・データの特定のキー範囲を強調表示します。
 ・特定の定数値にしきい値を表す線を追加します。

StripLine クラス (System.Windows.Forms.DataVisualization.Charting)

かなり抽象的な説明ですが、"グラフを装飾するための線分を表示するもの"という認識でしょう。
おそらく、最も使用するパターンは、
 ・グラフ上の個々 の値を検索するためには、読みやすさを向上します。
 ・特定の定数値にしきい値を表す線を追加します。
このあたりでしょう。

試しに使ってみる

今回は、ランダムに設定したデータの平均値をStripLine で表示してみます。
開発環境はこちら。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Chart02Sample
{
    using System.Windows.Forms.DataVisualization.Charting;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            UpdateChartData();
        }
        
        private void UpdateChartData()
        {
            chart1.Series.Clear();
            chart1.ChartAreas[0].AxisY.StripLines.Clear();

            // グラフ用のデータを構築する。
            Random r = new Random();
            PlotData[] plotData = Enumerable.Range(0, 100).Select(x => new PlotData { X = x, Y = r.Next(10, 90) }).ToArray();
            Series series = chart1.Series.Add("サンプル");
            series.ChartType = SeriesChartType.Line;
            foreach (var data in plotData)
            {
                series.Points.AddXY(data.X, data.Y);
            }

            // 平均値の水平線を表示する。
            double mean = chart1.DataManipulator.Statistics.Mean("サンプル");
            StripLine stlipLine = new StripLine
                                      {
                                          Text              = $"平均値:{mean}",
                                          TextAlignment     = StringAlignment.Near,     // テキストの水平位置(Near:左, Center:中央, Far:右)
                                          TextLineAlignment = StringAlignment.Far,      // テキストの垂直位置(Near:下, Center:中央, Far:上)
                                          Interval          = 0,                        // 線分の表示間隔 値を設定すると指定した間隔で表示される。
                                          IntervalOffset    = mean,                     // 線分の表示オフセット
                                          BorderWidth       = 1,
                                          BorderDashStyle   = ChartDashStyle.DashDot,
                                          BorderColor       = Color.Blue,
                                      };
            chart1.ChartAreas[0].AxisY.StripLines.Add(stlipLine);
        }

        private void ReloadButton_Click(object sender, EventArgs e)
        {
            UpdateChartData();
        }
    }

    /// <summary>
    /// グラフデータ
    /// </summary>
    public class PlotData
    {
        public int X { get; set; }

        public double Y { get; set; }
    }
}

平均値は chart1.DataManipulator.Statistics.Mean("サンプル") で求めています。
DataManipulator は、プロットデータの集計など、結構汎用的に使えて便利なのですが今回は割愛。

これを実行するとこのようになります。↓↓↓
f:id:iyemon018:20170413165418j:plain

これを応用すれば、最大値や最小値、データのプロット範囲などを表現することが可能です。
ちょっとした工夫でグラフが見やすくなるので覚えておくと便利そうです。

今回使用したサンプルはこちら↓↓↓
github.com

Windows Forms のChart を使う~SeriesChartType:グラフ系列種別~

最近Windows FormsのChartを使用する機会があったので、備忘録として使い方を残します。

まず今回はChartにどんな種類のグラフが使用できるのか見ていきます。
Chartの系列は"Series"プロパティでアクセスすることができます。
この系列の種類を変えるには、ChartType プロパティを変更すればOKです。
ChartTypeプロパティは、列挙体のSeriesChartType 型ですが、これは以下の種別が定義されています。
なので、ここに定義されているグラフの種類=Chartで表現できる種類 ということです。

続きを読む