Mejorada logica de copia desde y al portapapeles
This commit is contained in:
parent
c047fb2c01
commit
039c158c5b
55
App.xaml.cs
55
App.xaml.cs
|
@ -25,7 +25,7 @@ namespace GTPCorrgir
|
||||||
|
|
||||||
KeyboardHelper pasteLogic = new KeyboardHelper();
|
KeyboardHelper pasteLogic = new KeyboardHelper();
|
||||||
|
|
||||||
protected override void OnStartup(StartupEventArgs e)
|
protected override async void OnStartup(StartupEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnStartup(e);
|
base.OnStartup(e);
|
||||||
_cancellationTokenSource = new CancellationTokenSource();
|
_cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
@ -34,11 +34,22 @@ namespace GTPCorrgir
|
||||||
{
|
{
|
||||||
pasteLogic.SaveCurrentWindow();
|
pasteLogic.SaveCurrentWindow();
|
||||||
|
|
||||||
if (System.Windows.Clipboard.ContainsText())
|
if (Opciones.Instance.AutoCopy)
|
||||||
{
|
{
|
||||||
GTP.TextoACorregir = System.Windows.Clipboard.GetText();
|
await pasteLogic.AutoCopyFromActiveWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (System.Windows.Clipboard.ContainsText())
|
||||||
|
{
|
||||||
|
GTP.TextoACorregir = await ClipboardHelper.GetText();
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(GTP.TextoACorregir))
|
||||||
|
{
|
||||||
|
GTP.Log.Log("No hay texto en el portapapeles");
|
||||||
|
ShowCustomNotification("Error", "No hay texto para procesar");
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir ||
|
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir ||
|
||||||
Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
||||||
{
|
{
|
||||||
|
@ -102,7 +113,7 @@ namespace GTPCorrgir
|
||||||
if (GTP.TextoCorregido != null)
|
if (GTP.TextoCorregido != null)
|
||||||
{
|
{
|
||||||
GTP.Log.Log("Copiando texto corregido al portapapeles");
|
GTP.Log.Log("Copiando texto corregido al portapapeles");
|
||||||
System.Windows.Clipboard.SetText(GTP.TextoCorregido);
|
await ClipboardHelper.SetText(GTP.TextoCorregido);
|
||||||
ShowCustomNotification("Se puede pegar",
|
ShowCustomNotification("Se puede pegar",
|
||||||
$"Corrección en: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
$"Corrección en: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
||||||
|
|
||||||
|
@ -116,7 +127,7 @@ namespace GTPCorrgir
|
||||||
else if (Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
else if (Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
||||||
{
|
{
|
||||||
GTP.Log.Log("Ejecutando pegado automático");
|
GTP.Log.Log("Ejecutando pegado automático");
|
||||||
pasteLogic.RestoreAndSimulatePaste();
|
await pasteLogic.RestoreAndSimulatePaste();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -213,38 +224,4 @@ namespace GTPCorrgir
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class KeyboardHelper
|
|
||||||
{
|
|
||||||
[DllImport("user32.dll", SetLastError = true)]
|
|
||||||
private static extern IntPtr GetForegroundWindow();
|
|
||||||
|
|
||||||
[DllImport("user32.dll", SetLastError = true)]
|
|
||||||
private static extern bool SetForegroundWindow(IntPtr hWnd);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
|
|
||||||
|
|
||||||
public const int KEYEVENTF_KEYUP = 0x0002; // Key up flag
|
|
||||||
public const int VK_CONTROL = 0x11; // Control key code
|
|
||||||
public const int V = 0x56; // V key code
|
|
||||||
|
|
||||||
private IntPtr previousWindow;
|
|
||||||
|
|
||||||
public void SaveCurrentWindow()
|
|
||||||
{
|
|
||||||
previousWindow = GetForegroundWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RestoreAndSimulatePaste()
|
|
||||||
{
|
|
||||||
// Restore focus to the previous window
|
|
||||||
SetForegroundWindow(previousWindow);
|
|
||||||
|
|
||||||
// Simulating Ctrl+V
|
|
||||||
keybd_event((byte)VK_CONTROL, 0x9d, 0, UIntPtr.Zero); // Ctrl Press
|
|
||||||
keybd_event((byte)V, 0x9e, 0, UIntPtr.Zero); // V Press
|
|
||||||
keybd_event((byte)V, 0x9e, KEYEVENTF_KEYUP, UIntPtr.Zero); // V Release
|
|
||||||
keybd_event((byte)VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, UIntPtr.Zero); // Ctrl Release
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace GTPCorrgir
|
||||||
|
{
|
||||||
|
public static class ClipboardHelper
|
||||||
|
{
|
||||||
|
private static readonly int MaxRetries = 5;
|
||||||
|
private static readonly int RetryDelay = 100; // milliseconds
|
||||||
|
|
||||||
|
public static async Task<bool> SetText(string text)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MaxRetries; i++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Delay(RetryDelay);
|
||||||
|
await System.Windows.Application.Current.Dispatcher.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
System.Windows.Clipboard.SetText(text);
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
if (i == MaxRetries - 1) throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<string> GetText()
|
||||||
|
{
|
||||||
|
string text = null;
|
||||||
|
for (int i = 0; i < MaxRetries; i++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Delay(RetryDelay);
|
||||||
|
text = await System.Windows.Application.Current.Dispatcher.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
return System.Windows.Clipboard.GetText();
|
||||||
|
});
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
if (i == MaxRetries - 1) throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace GTPCorrgir
|
||||||
|
{
|
||||||
|
public class KeyboardHelper
|
||||||
|
{
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern IntPtr GetForegroundWindow();
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
|
||||||
|
|
||||||
|
private const int KEYEVENTF_EXTENDEDKEY = 0x0001;
|
||||||
|
private const int KEYEVENTF_KEYUP = 0x0002;
|
||||||
|
private const int VK_CONTROL = 0x11;
|
||||||
|
private const int VK_A = 0x41;
|
||||||
|
private const int VK_C = 0x43;
|
||||||
|
private const int VK_V = 0x56;
|
||||||
|
|
||||||
|
private IntPtr previousWindow;
|
||||||
|
|
||||||
|
public void SaveCurrentWindow()
|
||||||
|
{
|
||||||
|
previousWindow = GetForegroundWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AutoCopyFromActiveWindow()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Asegurarse de que la ventana anterior tenga el foco
|
||||||
|
SetForegroundWindow(previousWindow);
|
||||||
|
|
||||||
|
// Pequeña pausa para asegurar que la ventana tiene el foco
|
||||||
|
await Task.Delay(100);
|
||||||
|
|
||||||
|
// Simular Ctrl+A
|
||||||
|
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_A, 0, KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_A, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, UIntPtr.Zero);
|
||||||
|
|
||||||
|
// Pequeña pausa entre comandos
|
||||||
|
await Task.Delay(50);
|
||||||
|
|
||||||
|
// Simular Ctrl+C
|
||||||
|
keybd_event(VK_C, 0, KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_C, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, UIntPtr.Zero);
|
||||||
|
|
||||||
|
// Dar tiempo para que se complete la operación de copiado
|
||||||
|
await Task.Delay(100);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error en AutoCopyFromActiveWindow: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task RestoreAndSimulatePaste()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Asegurarse de que la ventana anterior tenga el foco
|
||||||
|
SetForegroundWindow(previousWindow);
|
||||||
|
|
||||||
|
// Pequeña pausa para asegurar que la ventana tiene el foco
|
||||||
|
await Task.Delay(100);
|
||||||
|
|
||||||
|
// Simular Ctrl+V
|
||||||
|
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_V, 0, KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_V, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, UIntPtr.Zero);
|
||||||
|
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, UIntPtr.Zero);
|
||||||
|
|
||||||
|
// Dar tiempo para que se complete la operación de pegado
|
||||||
|
await Task.Delay(100);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error en RestoreAndSimulatePaste: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
Program.cs
24
Program.cs
|
@ -14,8 +14,9 @@ namespace GTPCorrgir
|
||||||
OpenAI,
|
OpenAI,
|
||||||
Ollama,
|
Ollama,
|
||||||
Groq,
|
Groq,
|
||||||
Grok // x.ai
|
Grok
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum modoDeUso
|
public enum modoDeUso
|
||||||
{
|
{
|
||||||
Corregir,
|
Corregir,
|
||||||
|
@ -27,15 +28,15 @@ namespace GTPCorrgir
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<LLM_a_Usar, string> nombreLLM = new Dictionary<LLM_a_Usar, string>
|
public Dictionary<LLM_a_Usar, string> nombreLLM = new Dictionary<LLM_a_Usar, string>
|
||||||
{
|
{
|
||||||
{ Opciones.LLM_a_Usar.Ollama, "Ollama" },
|
{ LLM_a_Usar.Ollama, "Ollama" },
|
||||||
{ Opciones.LLM_a_Usar.Groq, "Groq" },
|
{ LLM_a_Usar.Groq, "Groq" },
|
||||||
{ Opciones.LLM_a_Usar.Grok, "Grok" },
|
{ LLM_a_Usar.Grok, "Grok" },
|
||||||
{ Opciones.LLM_a_Usar.OpenAI, "OpenAI" },
|
{ LLM_a_Usar.OpenAI, "OpenAI" },
|
||||||
|
};
|
||||||
};
|
|
||||||
|
|
||||||
private static Opciones _instance;
|
private static Opciones _instance;
|
||||||
|
public bool AutoCopy { get; set; }
|
||||||
|
|
||||||
public static Opciones Instance
|
public static Opciones Instance
|
||||||
{
|
{
|
||||||
|
@ -46,6 +47,7 @@ namespace GTPCorrgir
|
||||||
_instance = new Opciones();
|
_instance = new Opciones();
|
||||||
_instance.LLM = LLM_a_Usar.Grok;
|
_instance.LLM = LLM_a_Usar.Grok;
|
||||||
_instance.modo = modoDeUso.Chat;
|
_instance.modo = modoDeUso.Chat;
|
||||||
|
_instance.AutoCopy = false;
|
||||||
}
|
}
|
||||||
return _instance;
|
return _instance;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +56,8 @@ namespace GTPCorrgir
|
||||||
public LLM_a_Usar LLM { get; set; }
|
public LLM_a_Usar LLM { get; set; }
|
||||||
public modoDeUso modo { get; set; }
|
public modoDeUso modo { get; set; }
|
||||||
|
|
||||||
public string nombreDeLLM() {
|
public string nombreDeLLM()
|
||||||
|
{
|
||||||
return nombreLLM[LLM];
|
return nombreLLM[LLM];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +98,8 @@ namespace GTPCorrgir
|
||||||
Opciones.Instance.modo = Opciones.modoDeUso.Traducir_a_Italiano;
|
Opciones.Instance.modo = Opciones.modoDeUso.Traducir_a_Italiano;
|
||||||
else if (arg.Contains("Traducir_a_Espanol"))
|
else if (arg.Contains("Traducir_a_Espanol"))
|
||||||
Opciones.Instance.modo = Opciones.modoDeUso.Traducir_a_Espanol;
|
Opciones.Instance.modo = Opciones.modoDeUso.Traducir_a_Espanol;
|
||||||
|
else if (arg.Contains("AutoCopy"))
|
||||||
|
Opciones.Instance.AutoCopy = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue