One of the drawbacks of having flexible work hours is when forgetting to punch in when you enter the office. later during the week when you try to remember when did you arrive could be hard and I prefer to offload it from myself.
I don't know about you, but usually the first thing I do when I enter the office and go to my seat and unlock the computer and the last thing is locking the computer.
My solution? write an application that logs these events.
So, what can we learn from that application?
SessionSwitch event which passes SessionSwitchReason that can tell you what happened, if the station was locked, unlocked, remote desktop connected, disconnected which was enough for me, I wanted the application to log whenever I lock the station since I don't usually shutdown the computer at the end of the day and i wanted it to log whenever I connect remotely in the morning so if I work from home that day, I can get that logged too.
We can get the currently logged in username with WindowsIdentity.GetCurrent()
Invoking methods asynchronously with MethodInvoker
Accelerating LINQ to objects queries with PLINQ's AsParallel
Interlocked.CompareExchange as a simple way of checking if a method is already executing.
Final thoughts -
I wrote the initial application a long time ago, but I've recently overhauled the the whole application so it will be more presentable, there are still some logical problems, such as the daily calculations and weekly calculations sometimes show incorrect data and there are some extreme situations when something is not logged consistently it will show wrong numbers, but this is good enough for me and not worth spending more time, I'm mostly using the logging function, the calculations are just for getting a rough number.
This is a toy for myself, I just thought to share it, if you need any kind of reliability or tracking, this toy is not for you.