163 lines
5.2 KiB
C#
163 lines
5.2 KiB
C#
using Pulsar.Client.Utilities.DarkMode;
|
|
using Pulsar.Common.Messages.UserSupport.RemoteChat;
|
|
using Pulsar.Common.Networking;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Pulsar.Client
|
|
{
|
|
public partial class FrmRemoteChat : Form
|
|
{
|
|
[DllImport("user32.dll")]
|
|
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
|
|
|
|
[DllImport("user32.dll")]
|
|
static extern bool SetForegroundWindow(IntPtr hWnd);
|
|
[DllImport("user32.dll")]
|
|
public static extern bool BringWindowToTop(IntPtr hWnd);
|
|
|
|
[DllImport("user32.dll")]
|
|
public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
|
|
|
|
[DllImport("Kernel32.dll")]
|
|
public static extern uint GetCurrentThreadId();
|
|
[DllImport("user32.dll")]
|
|
public static extern IntPtr GetForegroundWindow();
|
|
|
|
private ISender _connectedClient;
|
|
public bool Active;
|
|
|
|
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
|
|
private const uint SWP_NOMOVE = 0x0002;
|
|
private const uint SWP_NOSIZE = 0x0001;
|
|
private const uint SWP_SHOWWINDOW = 0x0040;
|
|
|
|
public FrmRemoteChat(ISender client)
|
|
{
|
|
|
|
this._connectedClient = client;
|
|
InitializeComponent();
|
|
DarkModeManager.ApplyDarkMode(this);
|
|
Active = true;
|
|
txtMessage.KeyDown += new KeyEventHandler(txtMessage_KeyDown); // Subscribe to the KeyDown event
|
|
|
|
}
|
|
protected override CreateParams CreateParams
|
|
{
|
|
get
|
|
{
|
|
var cp = base.CreateParams;
|
|
cp.ExStyle |= 0x80;
|
|
return cp;
|
|
}
|
|
}
|
|
|
|
|
|
public void AddMessage(string sender, string message)
|
|
{
|
|
txtMessages.AppendText(string.Format("{0} {1}: {2}{3}", DateTime.Now.ToString("HH:mm:ss"), sender, message, Environment.NewLine));
|
|
ForceFocus();
|
|
|
|
}
|
|
|
|
private void FrmRemoteChat_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
// Allow the form to close
|
|
}
|
|
public void ForceFocus()
|
|
{
|
|
var fThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
|
|
var cThread = GetCurrentThreadId();
|
|
if (fThread != cThread)
|
|
{
|
|
AttachThreadInput(fThread, cThread, true);
|
|
BringWindowToTop(Handle);
|
|
AttachThreadInput(fThread, cThread, false);
|
|
}
|
|
else BringWindowToTop(Handle);
|
|
txtMessage.Focus();
|
|
}
|
|
private void FrmRemoteChat_Shown(object sender, EventArgs e)
|
|
{
|
|
txtMessage.Focus();
|
|
}
|
|
|
|
public string sendlol()
|
|
{
|
|
return txtMessage.Text.Trim();
|
|
}
|
|
public void SendMessageServer(ISender connectedClient, string message)
|
|
{
|
|
connectedClient.Send(new GetChat { Message = message });
|
|
}
|
|
|
|
|
|
private void txtMessage_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Enter)
|
|
{
|
|
e.SuppressKeyPress = true; // Prevents the ding sound on pressing enter
|
|
Sendpacket_Click(this, new EventArgs()); // Call the Send method
|
|
}
|
|
}
|
|
|
|
private void Sendpacket_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (txtMessage.Text.Trim() != "")
|
|
{
|
|
SendMessageServer(_connectedClient, txtMessage.Text.Trim());
|
|
AddMessage("Me", txtMessage.Text.Trim());
|
|
txtMessage.Text = "";
|
|
txtMessage.Focus();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
|
|
private void FrmRemoteChat_FormClosed(object sender, FormClosedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
AddMessage("System", "Chat has been ended.");
|
|
SendMessageServer(_connectedClient, "Chat has been ended.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
|
|
[DllImport("user32.dll", SetLastError = true)]
|
|
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
|
|
protected override void OnShown(EventArgs e)
|
|
{
|
|
base.OnShown(e);
|
|
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
|
|
}
|
|
protected override void WndProc(ref Message m)
|
|
{
|
|
base.WndProc(ref m);
|
|
const int WM_ACTIVATE = 0x0006;
|
|
const int WM_SHOWWINDOW = 0x0018;
|
|
if (m.Msg == WM_ACTIVATE || m.Msg == WM_SHOWWINDOW)
|
|
{
|
|
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
|
|
}
|
|
}
|
|
}
|
|
}
|