-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add detection for current use of computer's camera
Spawns another thread to poll the registry for any apps that have a reg value "LastUsedTimeStop" of 0. Reports the application name and the status to HA. Ref #1
- Loading branch information
Showing
5 changed files
with
131 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
using Microsoft.Win32; | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Text; | ||
using System.Text.RegularExpressions; | ||
using System.Threading; | ||
using System.Threading.Tasks; | ||
|
||
namespace TeamsPresence | ||
{ | ||
public class CameraStatusChangedEventArgs : EventArgs | ||
{ | ||
public CameraStatus Status { get; set; } | ||
public string AppName { get; set; } | ||
} | ||
|
||
public class CameraDetectionService | ||
{ | ||
private const string SubKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\webcam"; | ||
private const string AppNamePattern = @"_[\d|\w]{13}$"; | ||
|
||
public event EventHandler<CameraStatusChangedEventArgs> StatusChanged; | ||
|
||
private int PollingRate; | ||
private string ActiveAppName = ""; | ||
|
||
public CameraDetectionService(int pollingRate) | ||
{ | ||
PollingRate = pollingRate; | ||
} | ||
|
||
public void Start() | ||
{ | ||
var appNameRegex = new Regex(AppNamePattern); | ||
|
||
while (true) | ||
{ | ||
var activeCameraApp = GetActiveCameraApp(); | ||
|
||
if (activeCameraApp != null) | ||
activeCameraApp = appNameRegex.Replace(activeCameraApp, "", 1); | ||
|
||
if (activeCameraApp != ActiveAppName) | ||
{ | ||
ActiveAppName = activeCameraApp; | ||
|
||
StatusChanged?.Invoke(this, new CameraStatusChangedEventArgs() | ||
{ | ||
Status = ActiveAppName == "" ? CameraStatus.Inactive : CameraStatus.Active, | ||
AppName = ActiveAppName | ||
}); | ||
} | ||
|
||
Thread.Sleep(PollingRate); | ||
} | ||
} | ||
|
||
private string GetActiveCameraApp() | ||
{ | ||
var key = Registry.CurrentUser.OpenSubKey(SubKey); | ||
|
||
foreach (var app in key.GetSubKeyNames()) | ||
{ | ||
var lastUsedTimeStop = Registry.CurrentUser.OpenSubKey($@"{SubKey}\{app}")?.GetValue("LastUsedTimeStop"); | ||
|
||
if (lastUsedTimeStop != null && (long)lastUsedTimeStop == 0) | ||
{ | ||
return app; | ||
} | ||
} | ||
|
||
return ""; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,4 +28,10 @@ public enum TeamsActivity | |
NotInACall, | ||
InACall | ||
} | ||
|
||
public enum CameraStatus | ||
{ | ||
Inactive, | ||
Active | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters