son - simular presionar tecla c#
EnvĂo de comandos de macros de teclado al juego Windows (5)
¿Estás recuperando el control de la ventana todo el tiempo, o lo estás recordando?
Si usa la API FindWindow (), simplemente puede almacenar el identificador y usar la API SendMessage para enviar eventos de clave / mouse de forma manual.
Quiero hacer un macroprograma para un juego. Pero hay un problema con el envío de claves solo a la aplicación del juego (ventana del juego). Estoy usando la API keybd_event
para enviar claves a la ventana del juego. Pero solo quiero enviar claves a la ventana del juego, no al explorador ni a ninguna ventana abierta mientras se ejecuta mi macroprograma. Cuando cambié Windows todavía está enviando claves. Intenté utilizar Interaction.App
con la referencia de Visual Basic.dll
. Pero Interaction.App
only Enfoca la ventana del juego.
No pude encontrar nada sobre mi problema. ¿Alguien puede ayudarme? Gracias
FindWindow API:
http://www.pinvoke.net/default.aspx/user32.FindWindowEx
API SendMessage:
http://www.pinvoke.net/default.aspx/user32/SendMessage.html
VB
Private Const WM_KEYDOWN As Integer = &H100
Private Const WM_KEYUP As Integer = &H101
DO#
private static int WM_KEYDOWN = 0x100
private static int WM_KEYUP = 0x101
Si quieres comunicarte con un juego, normalmente tendrás que lidiar con DirectInput, no con las API de teclado normales.
arreglé mi problema en este campo ;
PostMessage (hWnd, WM_KEYDOWN, clave, {tiene que dar lParam de la clave} );
de lo contrario, no funciona. Y podemos controlar ChildWindow Class con la herramienta Spy ++ de Microsoft.
Gracias a todos por ayudar.
class SendKeySample
{
private static Int32 WM_KEYDOWN = 0x100;
private static Int32 WM_KEYUP = 0x101;
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, int lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
public static IntPtr FindWindow(string windowName)
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.MainWindowHandle != IntPtr.Zero && p.MainWindowTitle.ToLower() == windowName.ToLower())
return p.MainWindowHandle;
}
return IntPtr.Zero;
}
public static IntPtr FindWindow(IntPtr parent, string childClassName)
{
return FindWindowEx(parent, IntPtr.Zero, childClassName, string.Empty);
}
public static void SendKey(IntPtr hWnd, System.Windows.Forms.Keys key)
{
PostMessage(hWnd, WM_KEYDOWN, key, 0);
}
}
Código de llamada
var hWnd = SendKeySample.FindWindow("Untitled - Notepad");
var editBox = SendKeySample.FindWindow(hWnd, "edit");
SendKeySample.SendKey(editBox, Keys.A);