2016-10-31 6 views
0

Я использую следующий код в C#, чтобы имитировать нажатие клавиатуры:C# Симуляция клавиатуры нажмите на ОС ниже Windows 8

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

[DllImport("User32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

[DllImport("user32")] 
private static extern bool SetForegroundWindow(IntPtr hwnd); 

void sim_key(string text, string proc) 
{ 
    var process = Process.GetProcessesByName(proc).FirstOrDefault(); 
    if (process != null && process.MainWindowHandle != IntPtr.Zero) 
    { 
     SetForegroundWindow(process.MainWindowHandle); 
     SendKeys.Send(kat_id); 
    } 
} 

Я тестировал на Windows Xp, 7, 8.1, 10 и Server 2012. В окнах 7 и Xp внешнее окно приложения обрабатывается правильно, однако ключи не отправляются. В системах выше Win 7 все правильно. Как его исправить?

Редактировать: Я проверил его на .NET 4.0 Client Profile и .NET 4.6.1 на 32- и 64-разрядных машинах, но результаты те же, что описаны выше.

+0

Вы можете попробовать keybd_event вместо SendKeys. – Skynet

ответ

0

Я думаю, что вы можете пойти с этим грубым кодом

const int WM_CHAR = 0x0102; 
    const int WM_KEYDOWN = 0x0100; 

if (process != null && process.MainWindowHandle != IntPtr.Zero) 
    { 
     PostMessage(process.MainWindowHandle, WM_CHAR, (int) <a character you want to send> , 1); 
    } 

Использование

PostMessage(process.MainWindowHandle, WM_KEYDOWN, 13, 1); 

послать "Enter".

Обратите внимание, что вы можете использовать SendMessage вместо PostMessage. Разница в том, что последний не дожидается обработки ключа. Они имеют ту же сигнатуру:

[DllImport("User32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

Вам не нужно вызова SetForegroundWindow(process.MainWindowHandle);, если вы просто хотите отправить ключи.

0

Благодарим вас за ответ. Я попытался использовать PostMessage для отправки Ctrl + F10 в другое окно. Вот мой код:

public const int WM_KEYDOWN = 0x100; 
public const int WM_KEYUP = 0x101; 
public const int VK_CONTROL = 0x11; 
public const int VK_F10 = 0x79; 

PostMessage(process.MainWindowHandle, WM_KEYDOWN, VK_CONTROL, null); 
PostMessage(process.MainWindowHandle, WM_KEYDOWN, VK_F10, null); 
PostMessage(process.MainWindowHandle, WM_KEYUP, VK_F10, null); 
PostMessage(process.MainWindowHandle, WM_KEYUP, VK_CONTROL, null); 

Однако, он не передает ключи к приложению.