Pregunta

I Wanna Pulsar la clave para un programa, incluso si se está ejecutando en segundo plano. Pero no puedo hacer esto solo para la libreta como esta,

[DllImport("user32.dll")]
protected static extern byte VkKeyScan(char ch);

[DllImport("user32.dll", SetLastError = true)]
protected static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
protected static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

char Key = // key value to send

IntPtr hWnd = FindWindowEx(_handle, IntPtr.Zero, "edit", null);   // _handle is the windows handle of the program (here its notepad)
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan(Key), 0);

Sin embargo, para todas las demás aplicaciones que no puedo enviar pulsaciones de teclas, si sus antecedentes en. Como yo no sé la lpszClass de ese programa (creo que esto es el nombre Usercontrol del área de escritura en ese programa. Para el Bloc de notas es "edit". Me pareció que esta navegación por Internet).

Para todas las demás aplicaciones de lo que estoy haciendo es, conseguir la aplicación de conocimientos adquiridos, a continuación, enviar la clave, luego otra vez conseguir mi primer plano programa. Necesito mi programa que se ejecuta como siempre en primer plano.

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

SetForegroundWindow(_handle);       // _handle is the windows handle of the program

System.Threading.Thread.Sleep(50);       // Waiting few milliseconds till application coming to foreground.                    
wsh.SendKeys(Key.ToString(), ref wait);  // wsh is WshShellClass wsh= new WshShellClass();
SetForegroundWindow(_mainHandle);    // _mainHandle is the windows handle of my application

Pero de esta manera no está funcionando. algunas claves perdidas y consiguiendo el programa foreground-> fondo-> foregound-> fondo ...... al igual que su baile ...

¿Cómo enviar teclas a otras aplicaciones si su ejecución en segundo plano. o hay alguna forma / fuente para encontrar el lpszClass de un programa?

Lo siento si me he perdido ninguna información requerida. esta es una gran aplicación. He publicado sólo piezas requeridas aquí. Si alguien necesita cualquier información adicional, pls piden.

¿Fue útil?

Solución

Es posible que pueda averiguar la lpszClass del programa usando una herramienta de inspección tales como WinSpy ++ . Se le da un punto de mira que se puede arrastrar y posición sobre el control deseado. Esto fue capaz de proporcionar fácilmente con la "edición" nombre de clase para el bloc de notas.

Si las cosas no funcionan, haga clic en el "Más >>" botón en la parte inferior derecha de WinSpy ++, a continuación, haga clic en el botón "Localizar" para ver la jerarquía de control; puede que tenga que enviar el mensaje WM_KEYDOWN a uno de los controles principales o secundarios en su lugar.

Otros consejos

Creo que usted necesita tener el programa en segundo plano instalar un gancho de teclado de bajo nivel a través de la función de Win32 SetWindowsHookEx ().

Aquí está la documentación de MSDN para SetWindowsHookEx ()

http://msdn.microsoft.com /en-us/library/ms644990(v=vs.85).aspx

Y aquí está el artículo de KB sobre cómo hacerlo desde C #

http://support.microsoft.com/kb/318804

Este artículo entra en algunos detalles, también: http: //www.codeguru .com / columnas / vb / article.php / c4829

I espere que su aplicación va a quedar atrapados por varios software de spyware / anti-virus como un registrador de teclado, sin embargo.

Buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top