For the last couple of days, the focussed window on my dev box would occasionally lose focus. It was really annoying. It would always switch back, but I’d lose a couple letters here or there as I was typing.
I eventually found the following code that helped me track down the culprit:
Declare Auto Function GetForegroundWindow Lib "user32.dll" () As Integer Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Integer, ByRef procid As Integer) As UInteger Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.RichTextBox1.AppendText("Starting up at " & Now & vbCrLf) End Sub Private Sub GoingAway(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate, Me.LostFocus Dim hwnd As Integer = GetForegroundWindow() ' Note that process_id will be used as a ByRef argument ' and will be changed by GetWindowThreadProcessId Dim process_id As Integer = 1 GetWindowThreadProcessId(hwnd, process_id) If (process_id <> 1) Then Dim appExePath As String = Process.GetProcessById(process_id).MainModule.FileName() Me.RichTextBox1.AppendText("Lost focus at " & Now & " due to " & appExePath & vbCrLf) Else Me.RichTextBox1.AppendText("Lost focus due to unknown cause.") End If End Sub
Create a new vb windows forms app, add a default-named Rich Text Box, then paste this code in the code-behind and run it. It hooks up a handler to the Deactive and LostFocus events that will print out some information about what process is stealing focus.
In my case it ended up being Windows Error Reporting Service (which I stopped and disabled, because I don’t really care about it right now), though I’m sure there’s an underlying error going down in my system.
Ah well, that’s an issue for another day.