非常に高速なWindowsユーザー切り替え

数年前から毎日使っているライフハックを皆さんと共有したいと思います。 完璧に機能し、時間を節約します。 妻と私が同じ自宅のコンピューターに別のアカウントを持っているということが起こりました。 これは便利です。それぞれに独自のデスクトップ、独自の壁紙、設定、アプリケーション設定、ブラウザのCookieがあります。 1つのアカウントでどのように作業できるか想像できません。 しかし(この「なし」がなければ記事はありません)、1つの小さな問題があります。 ユーザーの切り替え。 通常の方法:スタート->システムに応じた特定のボタン->ユーザーの変更。 ユーザー選択画面が表示されます。 適切なユーザーを突く。 はい、Win + Lキーボードショートカットがあります。 その後、再びユーザーの変更とアイコンを確認する必要があります。 合計最小3アクション。 Windows 8では、この点で顕著な改善が行われました。 [Win +ユーザー]アイコンをクリックして、リスト内のもう一方をクリックします。 しかし、これはアカウントにパスワードがあることを考慮していません。 これは重大な遅延がすでに始まっている場所です。 各スイッチがすぐに退屈するたびにパスワードを入力します。 また、リモートアクセスが必要なため、アカウントにパスワードを入力する必要がありました。 はい、リモートアクセス用に別のアカウントを作成することはできましたが、私のライフハックはそれまでに既に準備ができていて、アカウントにパスワードがあるかどうかに関係なく正常に機能しました。



そして、アイデアはそのようなものでした。 すばやくユーザーを切り替えることができます。 1つのホットキーをクリックします。 インターネットでの検索(約3年前)が実を結び、同様の解決策が見つかりました。 しかし、無料のものはバグが多かったり、サードパーティのソフトウェアをインストールする必要がありました。 しかし、有料で高品質で、1つが見つかり、1つは非常にうまく機能しましたが、1つ目は有料で、2つ目は追加の機能が含まれていました-ユーザーはホットキーを押してもすぐに切り替わりませんでしたが、Alt + Tabのようなウィンドウが表示されましたユーザーによって。 あなたの決定を書くことが決定されました。 最小限の機能を備えた最も単純な、ホットキー-切り替え。



グーグル発行:

私はすぐに予約します、そしてあなたは私にトマトを投げることができます、しかし私はこのことをc#で書きました、しかしプロでは確かにそれはより良く、よりネイティブになります、などなどですが...しかしその後私はc#を学び始め、私は経験を必要としました決定は書かれていて、書き直す必要はありませんでしたが、転送するのに1晩以上かかることはありませんでした。



そのため、まず、このコードのようなものをクリックして、ボタンを使用して単純なwin32アプリケーションを作成しました。

private void SwitchUser() { IntPtr buffer = IntPtr.Zero; int count = 0; //   ,     if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, ref buffer, ref count)) { WTS_SESSION_INFO[] sessionInfo = new WTS_SESSION_INFO[count]; //   : //       for (int index = 0; index < count; index++) sessionInfo[index] = (WTS_SESSION_INFO)Marshal.PtrToStructure((IntPtr)((int)buffer + (Marshal.SizeOf(new WTS_SESSION_INFO()) * index)), typeof(WTS_SESSION_INFO)); int activeSessId = -1; int targetSessId = -1; //  Id ,    // 0 ,   "Services" for (int i = 1; i < count; i++) { if (sessionInfo[i].State == WTS_CONNECTSTATE_CLASS.WTSDisconnected) targetSessId = sessionInfo[i].SessionId; else if (sessionInfo[i].State == WTS_CONNECTSTATE_CLASS.WTSActive) activeSessId = sessionInfo[i].SessionId; } if ((activeSessId > 0) && (targetSessId > 0)) { //    ,    . WTSConnectSession(Convert.ToUInt64(targetSessId), Convert.ToUInt64(activeSessId), "", false); } else { //   .   (    ) WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE, activeSessId, false); } } //    WTSFreeMemory(buffer); }
      
      





2つのセッションでは、sessionInfoには3つの要素があります。サービスセッション、1番目のユーザーセッション、2番目のユーザーセッションです。 したがって、targetSessIdとactiveSessIdは一意に決定されます。 2を超えるセッションの場合、アクティブと最後の非アクティブの間で切り替えが発生します。



しかし、ここで私は小さな後退に打たれました。 一部の人はすでにこれが機能しないと推測できました。 WTSConnectSessionがアプリケーションから実行されるとき、アクティブユーザーは切断されますが、2番目のユーザーは有効になりません。 つまり 簡単に言えば、あるユーザーのアプリケーションは別のユーザーの入力を開始できません。 しかし、サービスはそれを行うことができます! はい、残念ですが、システムサービスがなければ成功しません。 さて、このコードをドロップするシステムサービスを作成します。 これらのテクノロジでサービスを記述することは非常 に簡単な ので 、これがC#と.Netが便利な場所です。 ここで、次の問題が発生します。サービスにはユーザーインターフェイスがありません。 ユーザーはサービスの操作に直接影響を与えることはできず、サービスはユーザーのアクションを聞くことができません。 サービスにホットキーを掛けることはできません。



だからここに私たちのソリューションがあります:

ユーザーアプリケーションはユーザーをリッスンし、ホットキーが検出されると、切り替えを実行するシステムサービスに信号を送信します。



残りはほとんどありませんが、ここであなたに見せたいものを見つけることができます。 たとえば、必要なのは、ウィンドウのないデスクトップアプリケーションですが、ホットキーを受け入れるためです。 これは、誰でもできるように行うことができます。メインアプリケーションウィンドウを非表示にし、表示しません。 しかし、より良い解決策があります。 ApplicationContextを記述します。 黒で

たとえば、これ:

 internal class SUApplicationContext: ApplicationContext { private Hotkey hk; private Form form; private const int SWITCH_USER_COMMAND = 193; internal SUApplicationContext() { //   ,     //    form = new Form(); //    Win+A hk = new Hotkey(Keys.A, false, false, false, true); //    hk.Pressed += delegate { SendSwitchCommand(); }; //  ,   if (hk.GetCanRegister(form)) hk.Register(form); //     Application.ApplicationExit += Application_ApplicationExit; } private void SendSwitchCommand() { //    ServiceController sc = new ServiceController("Sus"); try { //    sc.ExecuteCommand(SWITCH_USER_COMMAND); } catch (Exception ex) { MessageBox.Show(ex.Message); } } void Application_ApplicationExit(object sender, EventArgs e) { //     if (hk.Registered) hk.Unregister(); } } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new SUApplicationContext()); }
      
      





ここでは、user32.dll関数RegisterHotKey、UnregisterHotKeyを介してインターネット上にあるMovablePython.Hotkeyインターフェイスを使用します。



そして、サービス自体についてのいくつかの行。

 protected override void OnCustomCommand(int command) { base.OnCustomCommand(command); if (command == SWITCH_USER_COMMAND) { SwitchUser(); } }
      
      





OnCustomCommandイベントを再定義し、コマンドを受け取ったら、既に知っている関数を実行します。



サービスを登録して開始し、各ユーザーでアプリケーションを起動するために残ります。



それだけです これで、コンピューターを起動してWin + Aを押した後、最初のユーザーがログインすると、セッションが切断され、ユーザー選択ウィンドウが表示されます。 2番目のユーザーが入力し、Win + Aを押します-最初のユーザーのセッションが表示されます。 等



githubでソースを読むことができます。 または、プロジェクト全体と、コンパイル済みですぐに使用できる実行可能ファイルをダウンロードできます。



All Articles