Дуже швидке переключення користувачів windows

Дуже швидке переключення користувачів windows
Хочу поділитися з вами Лайфхак, яким користуюся щодня вже протягом декількох років. Працює бездоганно, заощаджуючи час. Так повелося, що у нас з дружиною різні облікові записи на одному домашньому комп'ютері. Це зручно: у кожного свій робочий стіл, свої шпалери, переваги, настройки додатків, кукіси в браузері. Я навіть не уявляю зараз, як можна працювати під одним учеткой. Але (без цього "але" не було б і статті), є одна маленька проблема. Перемикання користувачів. Як це робиться зазвичай: Пуск -> якась кнопочка, в залежності від системи -> змінити користувача. З'являється екран вибору користувача. Тикаємо в потрібного користувача. Так, є поєднання клавіш Win + L. Після якого знову треба ткнути зміну користувача і іконку. Разом мінімум 3 дії. У Windows 8 зробили помітне поліпшення в цьому плані. натискаємо Win + іконку користувача і в списку натискаємо на іншого. Але це без урахування, що на учетке є пароль. Ось тут-то вже починаються суттєві затримки. Вводити пароль кожного разу при кожному перемиканні набридне дуже швидко. А пароль на свою учетку мені довелося поставити, так як потрібен був віддалений доступ. Так, можна було для віддаленого доступу зробити іншу учетку, але мій лайфхак вже був готовий до того моменту, і прекрасно працював незалежно від того, є паролі на учетке чи ні.

А ідея була така. Зробити так, щоб швидке переключення користувачів відбувалося за одну дію. При натисканні одного хоткея. Пошук в інтернеті (нагадаю, було це року 3 назад) приніс свої плоди, і подібні рішення були знайдені. Але, безкоштовні або глючить, або вимагали встановлення якогось сторонніх програм. А платна, якісна, знайшлася одна, і працювала одна дуже добре, але, по-перше, була платною, по-друге, містила зайвий функціонал - після натискання хоткея не відразу переключався користувач, а відображалося віконце (за подобою Alt + Tab) з користувачами. Було вирішено написати своє рішення. Найпростіше, з мінімумом функціоналу: хоткей - перемикання.

  • Для перемикання сесій використовуйте функції wtsapi32.dll: WTSEnumerateSessions. WTSConnectSession. WTSDisconnectSession (Зараз, коли дивлюся опис цих функцій, воно говорить що працює з віддаленими робочими сесіями, і чесно-кажучи, я в невеликому здивуванні, але у мене працює локально, безперечно).
  • Для хоткеев, використовуйте функції user32.dll: RegisterHotKey. UnregisterHotKey. Тут все просто.

Відразу обмовлюся, і можете кидати в мене помідорами, але писав я цю справу на c #, хоча на плюсах, було б звичайно краще, нативної і ін, ін, ін ... Але, тоді я тільки почав освоювати c # і потрібен був досвід, а коли рішення було написано, переписувати його не було необхідності, хоча перенесення його не займе більше одного вечора.

Отже, для початку було написано просте win32 додаток з кнопочкою, після натискання якої виконувався приблизно такий код:

При двох сеансах sessionInfo матиме 3 елементи: сеанс служб, сеанс 1-го користувача, сеанс 2-го користувача. Відповідно targetSessId і activeSessId визначаться однозначно. При сеансах більше 2, перемикання буде відбуватися між активним і останнім неактивним.

Але тут мене спіткала невелика невдача. Деякі вже могли здогадатися, що так справа не піде. У момент виконання WTSConnectSession з програми, відключення активного користувача відбувається, а ось включення другого користувача - немає. Тобто простіше кажучи, додаток одного користувача не може ініціювати вхід іншого користувача. Але це може зробити служба! Так, дуже шкода, але без системної служби у нас нічого не вийде. Добре, створимо системну службу в яку закинемо цей код. Ось тут-то і стане в нагоді C # і .Net, так як написати службу на цих технологіях дуже і дуже просто. Тепер виникає наступна проблема: служба не має призначеного для користувача інтерфейсу, тобто користувач не може безпосередньо вплинути на роботу служби, а служба не може почути дії користувача. Навісити хоткей на службу не можна.

Отже, ось наше рішення:
Користувача додаток слухає користувача, і при виявленні хоткея, посилає сигнал системної службі, яка і виконує перемикання.

Залишилося зовсім небагато, але і тут мені знайдеться що вам показати. Наприклад те, що нам потрібно десктопних програм, без вікон, але щоб воно приймало хоткеі. Це можна зробити так, як роблять усі: Приховати головне вікно програми, але не показувати. Але є рішення краще. Написати свій ApplicationContext. З блек
Наприклад такий:

Тут я використовую знайдений на просторах інтернету інтерфейс MovablePython.Hotkey над user32.dll функціями RegisterHotKey, UnregisterHotKey.

І пару рядків про саму службу.

Переобумовленої подія OnCustomCommand, і при отриманні нашої команди, виконуємо вже відому нам функцію.

Залишилося зареєструвати і запустити службу, і поставити в автозавантаження кожному користувачеві додаток.

Усе. Тепер після того, як увійшов перший користувач після запуску комп'ютера і натиснув Win + A, його сеанс відключається, і з'являється вікно вибору користувача. Входить другий користувач, натискає Win + A - з'являється сеанс першого користувача. І т.д.

На github ви можете ознайомитися з кодами. Або можете завантажити весь проект і скомпільовані і готові до роботи виконувані файли.

Схожі статті