Дуже швидке переключення користувачів windows
А ідея була така. Зробити так, щоб швидке переключення користувачів відбувалося за одну дію. При натисканні одного хоткея. Пошук в інтернеті (нагадаю, було це року 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 ви можете ознайомитися з кодами. Або можете завантажити весь проект і скомпільовані і готові до роботи виконувані файли.