20211009のC#に関する記事は3件です。

C# PC画面ロック 検出

みなさんこんにちは。 本日紹介する内容は、WindowsPCが検知されたことを検出する方法です。 画面ロック中は〇〇、解除中は〇〇したい。という機能が実現できます。 仕組み 画面のロック検知をするためには、画面の状態を通知する必要があります。 通知をする仕組みとして、「WTSRegisterSessionNotification」 という「wtsapi32」の機能を利用します。 通知を受けた後、画面のステータスを確認し、 ロック状態のステータスコードと等しい場合、PCがロックされたと認定します。 開発環境 Windows10  ※他のOSでは動作確認しておりませんが、恐らく問題なく動作します コード紹介 Form1.cs using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace LockDetect { public partial class Form1 : Form { [DllImport("WtsApi32.dll")] private static extern bool WTSRegisterSessionNotification(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] int dwFlags); [DllImport("WtsApi32.dll")] private static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd); const int NOTIFY_FOR_THIS_SESSION = 0; const int WM_WTSSESSION_CHANGE = 0x2b1; const int WTS_SESSION_LOCK = 0x7; const int WTS_SESSION_UNLOCK = 0x8; const int WTS_SESSION_REMOTE_CONTROL = 0x9; public Form1() { InitializeComponent(); // 画面状態の通知に必要 WTSRegisterSessionNotification(this.Handle, NOTIFY_FOR_THIS_SESSION); } protected override void WndProc(ref Message m) { // 画面状態が変更された if (m.Msg == WM_WTSSESSION_CHANGE) { int value = m.WParam.ToInt32(); switch (value) { case WTS_SESSION_LOCK: Console.WriteLine("PCがロックされました"); break; case WTS_SESSION_UNLOCK: Console.WriteLine("PCのロックが解除されました"); break; case WTS_SESSION_REMOTE_CONTROL: Console.WriteLine("PCがRDP制御されました"); break; default: break; } } base.WndProc(ref m); } } } 以上がコード紹介となります。 是非、ご参考ください。 今回はステータスコードとして、 ロック、アンロック、RDPのみ紹介していますが、他にも何種類かあるので 興味がある方は色々調べてみてください。 面白いステータスがあれば是非、共有いただけると幸いです。 参考 MicroSoft : WTSRegisterSessionNotification pinvoke.net : wtsregistersessionnotification (wtsapi32)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ASP.NET Core + SignalRの公式チュートリアルをやってみた!

はじめに 現在双方向通信などの勉強をしておりgRPCを主に調査していたのですが、お客様先の上司にSignalRについて教えてもらったので公式チュートリアルをやってみました! SignalRについては名前はよく聞いていたのですが、なかなか手を付ける機会がなく...しかしながらこの機会にちゃんと学習していこうと思います! 記事の内容は以下の公式チュートリアルに沿って学習した備忘録的な感じになっているので詳細はそちらを確認したほうが良さそうです。 Webアプリプロジェクトの作成 公式チュートリアルに沿って新しいプロジェクトクトの作成 > ASP.NET Core Webアプリを選択し、新規プロジェクトを作成します。 SignalRクライアントライブラリを追加 デフォルトではJavaScript用のSignalRライブラリは入っていないのでunpkgからインストールします。 SignalRプロジェクトを右クリック > 追加 > クライアント側のライブラリをクリックします。 以下のようにダイアログが表示されるのでプロバイダーをunpkg、ライブラリを@microsoft/signalr@latestとし、特定のファイルの選択を選択してsignalr.jsとsignalr.min.jsにチェックを入れます。 以下のように設定できたらインストールをクリックします。 SignalRハブの作成 Hubはクライアント側とサーバ側を繋げるパイプラインの役割を担います。 接続しているクライアント情報、グループ情報等を管理するHubクラスを継承し、以下のようにコードを作成します。 Chathub.cs using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace WebApplication1.Hubs { public class ChatHub : Hub { public async Task SendMessage(string user, string message) { //ハブに接続しているユーザ全てにメッセージを送信する。 await Clients.All.SendAsync("ReceiveMessage", user, message); } } } SignalRサーバの構成 Startupクラスへ以下のようにそれぞれ追加します。 startup.cs public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddSignalR(); //<--追加 } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //省略 app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); //Hubへのエンドポイント endpoints.MapHub<ChatHub>("/chatHub"); //<--追加 }); } SignalRクライアントコードの追加 Index.cshtml @page <div class="container"> <div class="row">&nbsp;</div> <div class="row"> <div class="col-2">User</div> <div class="col-4"><input type="text" id="userInput" /></div> </div> <div class="row"> <div class="col-2">Message</div> <div class="col-4"><input type="text" id="messageInput" /></div> </div> <div class="row">&nbsp;</div> <div class="row"> <div class="col-6"> <input type="button" id="sendButton" value="Send Message" /> </div> </div> </div> <div class="row"> <div class="col-12"> <hr /> </div> </div> <div class="row"> <div class="col-6"> <ul id="messagesList"></ul> </div> </div> <script src="~/js/signalr/dist/browser/signalr.js"></script> <script src="~/js/chat.js"></script> chat.js "use strict"; var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build(); // 上記のコネクションが成立するまでは送信ボタンを押せないようにします。 document.getElementById("sendButton").disabled = true; // Hub側から"ReceiveMessage"が呼び出された場合にこちらで登録した操作が動きます。 connection.on("ReceiveMessage", function (user, message) { var li = document.createElement("li"); document.getElementById("messagesList").appendChild(li); li.textContent = `${user} says ${message}`; }); connection.start().then(function () { document.getElementById("sendButton").disabled = false; }).catch(function (err) { return console.error(err.toString()); }); document.getElementById("sendButton").addEventListener("click", function (event) { var user = document.getElementById("userInput").value; var message = document.getElementById("messageInput").value; // Hub側のSendMessageメソッドを呼び出します。userとmessageはSendMessageメソッドの引数になります。 connection.invoke("SendMessage", user, message).catch(function (err) { return console.error(err.toString()); }); event.preventDefault(); }); デバッグ実行 実際に実行すると、以下のようにチャットアプリのような動きを確認することができます。 異なるタブから実行しても片方のタブの画面でチャット結果が表示されます。 おわりに こんな簡単にブラウザ間での双方向ストリーミングが出来るなんて!!とても良いですね! 双方向ストリーミングといえば最近はgRPCをよく聞きますが、そちらの勉強と並行してこちらも今後勉強していこうと思います!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラム初心者勉強会 1回目 -C# Windowsフォーム入門

※ この記事はニコ生、ツイッチで放送した「プログラム初心者勉強会」の中で学んだ事を書き残したものです。  やったこと 下のサイトの 1.Geting started ~ 5.イベントまでを学習  配信時の動画 チャプター情報は動画コメント参照  開発環境 VisualStudio2017 注意 参考にしてるサイトは、デザイナ機能を利用しない為「Form1.cs」を削除しています。 私は「Form1.cs」を活用する方法が学びたかったので、完全にこのサイトに即して学んではいないです。ご容赦 1.Getting started Windowsフォームを始める際の準備が記載されてました 配信時は.Net Frameworkはどのカテゴリに分類されるのかを話してましたね(フレームワークでいいのかな?) 2. メッセージボックス ~ 5. イベント まで GUI画面の作成、ボタン等の配置、並びにイベント付与の方法が記載されていました。 やり方はリンク先に全部書いているので省略。 配信中に為になったなと思った事を次からは書きます。 Usingディレクティブ について ソースコードの先頭で「using ~」と記述しているコードのことです。 各名前空間に定義されたクラスを使用する際、C#では「名前空間.クラス名」と記載する必要があります。 usingディレクティブをファイルの頭で使用することで、名前空間の指定を省略できます。 ※ 今回よく使ったusingディレクティブ ・ using System.Windows.Forms; ボタン等をWindowsフォームに配置する際に必要なクラスはほとんどこの名前空間で定義されていました。 今後の章でも活用しそう 2.2 WIndowsフォームのファイル構造について Windowsフォーム用のプロジェクトを作成すると、"Form1.cs"や"Program.cs"など、いろんなファイルが自動で作成されます。 それぞれの役割は何か、以下サイトに載ってました 重要なところを以下抜粋 2.2.1各ファイルの説明 ■ bin ‥ コンパイル時に実行ファイルが出力される ■ obj ‥ コンパイル時にコンパイルに必要なファイルが生成される? ■ Properties ‥ リソースファイルなどが含まれる App.config ‥ アプリケーション設定ファイル Form1.cs ‥ フォームの挙動を記述していくC#ファイル Form1.Designer.cs ‥ フォームの外観が自動で記述されていく Program.cs ‥ メイン関数(Form1.csを生成して実行する記述がある) test.csproj ‥ プロジェクトの設定ファイル? 赤字にしているのが特に触ることになるファイルです。それぞれの簡単な説明は以下参照 2.2.2 Form1.csについて  「ボタンをおしたときに何をするか」といった「挙動」を記述する際に編集します。  今回勉強する際に見ているサイトはこのファイルを削除している為、Program.csに「class Form1 : Form」を追記しています。本来やるべきではない書き方ですね。 2.2.2 Program.csについて  メイン関数のソースコード。Form1()はここから呼び出してます。 2.2.3 Form1.Designer.cs  フォームの外観が自動で記述されていきます。Form1.cs[デザイン]画面でボタンを置いたり、プロパティ設定すると、こちらに内容が反映されます。  namespaceのリネームについて  初回なら、namespace横の名前を右クリックし、「名前の変更」で関連する名前を一括で変更可能  class A : Bについて 配信時動画の1:14:15からが分かりやすいかと思います。 Aが実態で、Bは継承元です。Bはusing ~ で書いてる名前空間内のクラスの1つを記載しているはずです。 class Form1 : Form となっている場合は、Formが継承の役割を果たしています。 Formはusing System.Windows.Forms名前空間の中のFormクラスです。 配信時に見てたサイト 以上!! まとめる時間も無くて、かなり汚い乱文になって申し訳ない。 今後も配信後に簡単に振り返る記事かきますノシ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む