2015年12月09日

アプリケーションの実行に管理者権限を要求する方法

アプリケーションの実行に管理者権限を要求する方法


AddNewItemDialog.png

新しい項目の追加メニューでアプリケーションマニフェストファイルを追加する。
拡張子がmanifestのファイルが追加されるのでそれを編集する。

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC マニフェスト オプション
             Windows のユーザー アカウント制御のレベルを変更するには、
             requestedExecutionLevel ノードを以下のいずれかで置換します。

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            requestedExecutionLevel 要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。
            アプリケーションが下位互換性を保つためにこの仮想化を要求する場合、この要素を
            削除します。
        -->
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

うまく文字色が変ってませんが、7行目から18行目まではコメントです。
目的の箇所は19行目の定義。ここでlevelasInvokerからrequireAdministratorに変えます。
これだけ。

デバック実行の注意


この設定後にデバッグ実行すると「管理者権限がないので実行できない」と怒られる場合があります。
この場合は、一度VisualStudioを終了し、再度VisualStudio自身を管理者権限で実行します。
メニューを右クリックすると「管理者として実行」があるのでそれを選択する。
若しくはショートカットの設定を弄る。

常に管理者権限で実行させるにはレジストリを変更します。
posted by RR at 00:38 | Comment(0) | Tips | このブログの読者になる | 更新情報をチェックする

2015年12月10日

WPFでスターウォーズ

こんな画面です。

StarWars.png

最初に

「スターウォーズ」のオープニングのシーンを再現してみます。
同じようなことを考える人も多いようで、参考となるサイトが沢山ありました。
適当に見繕ってチョロっと修正してそれらしいのを作ります。

先ずはWPFのプロジェクトを新規に作成します。

ストーリーボードの作成

物語の説明がクロールで流れます。文字をTextBoxに表示してTransformで台形にしてストーリボードでY軸を移動させるのが簡単そうですが、Viewport3Dを使ったサンプルが一番それっぽい感じでした。

MainWindow.xamlに定義していきます。こんな感じです。

<Window x:Class="WpfStarwars.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfStarwars"
        mc:Ignorable="d"
        Title="Star Wars" Height="500" Width="800">
    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded" >
            <BeginStoryboard>
                <Storyboard Name="story">
                    <DoubleAnimation
                        Storyboard.TargetName="TextPos" 
                        Storyboard.TargetProperty="OffsetY" 
                        From="-1.5" To="5" Duration="0:1:30" RepeatBehavior="Forever"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>

    <Grid>
        <Viewport3D Name="viewport3D1" >
            <Viewport3D.Camera>
                <PerspectiveCamera x:Name="camMain" Position="0.5 -1 0.4" LookDirection="0 5 -1">
                </PerspectiveCamera>
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <AmbientLight Color="White"></AmbientLight>
                </ModelVisual3D.Content>
            </ModelVisual3D>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D x:Name="meshMain"
                                Positions="0.2 -5 0   0.8 -5 0   0.2 1 0   0.8 1 0"
                                TriangleIndices="0 1 3  0 3 2"
                                TextureCoordinates="0 1  1 1  0 0  1 0">
                            </MeshGeometry3D>
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>
                            <DiffuseMaterial x:Name="matDiffuseMain" >
                                <DiffuseMaterial.Brush>
                                  <VisualBrush>
                                    <VisualBrush.Visual>
                                       <Grid Width="200" Height="1000">
                                           <Border>
                                              <TextBlock x:Name="textBlock"
                                                    TextWrapping="Wrap"
                                                    Foreground="#FFFBFB02"
                                                    FontFamily="Franklin Gothic"
                                                    FontWeight="Bold"
                                                    FontSize="16"
                                                    TextAlignment="Justify"
                                                    LineHeight="17"
                                                    LineStackingStrategy="BlockLineHeight"
                                                    >
                                                 </TextBlock>
                                               </Border>
                                             </Grid>
                                         </VisualBrush.Visual>
                                     </VisualBrush>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
                <ModelVisual3D.Transform>
                    <TranslateTransform3D x:Name="TextPos" OffsetY="-1.5"/>
                </ModelVisual3D.Transform>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>
</Window>

※1行目は名前空間.クラス名になります。適宜修正して下さい。

文字列の設定
50行目のTextBlockに表示文字列を設定します。
XAML側にも書けますが、今回はコードビハインド側(MainWindow.xaml.cs)に記述します。

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // コンストラクタ内で設定
            textBlock.Text = crawl;
        }

// ここに定義されている文字列を表示します。
        string crawl = @"
Turmoil has engulfed the Galactic Republic. The taxation of trade routes to outlying star systems is in dispute.
Hoping to resolve the matter with a blockade of deadly battleships, the greedy Trade Federation has stopped all shipping to the small planet of Naboo.
While the congress of the Republic endlessly debates this alarming chain of events, the Supreme Chancellor has secretly dispatched two Jedi Knights, the guardians of peace and justice in the galaxy, to settle the conflict....";
    }

背景画像の設定

1.「星空」とか「夜空」とったキーワードで画像検索して気にったものをダウンロード(著作権に注意)
2.ソリューションエキスプローラ上でプロジェクトを右クリックして「追加」「既存項目」より画像ファイルを選択。
3.グリッドの背景に設定。XAMLでもコードビハインドでもできますが、以下はXAMLでの設定例。ImageBrushを使います。

   <Grid>
        <Grid.Background>
            <ImageBrush ImageSource="stars.jpg" />
        </Grid.Background>

音楽の再生

1.「Star Wars Theme free wav」なんてキーワードで無料の音声ファイルを探してダウンロード。
  ※.NETではWavファイルの再生は簡単ですがmp3などはちょっと面倒です。
2.ソリューションエクスプローラで「既存項目の追加」で追加する。
3.WAVファイルを選択し「プロパティ画面」で「ビルドアクション」を「埋め込みリソース」にする。
4.Loadイベントあたりで再生する。

// この名前空間の指定が必要
using System.Media;
using System.Reflection;
        // コンストラクタ
        public MainWindow()
        {
            Loaded += (_, __) =>
            {
               // アセンブリからストリームを取得
               // 引数の文字列は適宜修正して下さい(名前空間.ファイル名です)
                var asm = Assembly.GetExecutingAssembly();
                var stream = asm.GetManifestResourceStream("WpfStarwars.starwars.wav");
               // これで再生
                new SoundPlayer(stream).PlayLooping();
            };
        }
posted by RR at 01:46 | Comment(0) | サンプルプログラム  | このブログの読者になる | 更新情報をチェックする