2013-12-01 2 views
0

Кто-нибудь знает, как отправить ключевое нажатие на приложение с защитой sendkeys?Как отправить ввод клавиатуры в приложение с защитой

Я пробовал sendkeys, и в блокноте он работал безупречно, но когда я запускал целевое приложение и пробовал свою программу, это не так и в блокноте, это тоже не работает, когда это приложение запускалось.

Я не знаю, как обойти эту защиту.

+2

Вы говорите «что применение» как есть только одна заявка она может быть и предположим, что мы имели бы ни малейшего представления, что это такое, что вы говорите. – PhoenixReborn

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Не понимаю, что вы подразумеваете под защищенным приложением?

В любом случае SendKeys, который поставляется с платформой .NET, ограничен. Вы можете использовать Windows API:

[DllImport("user32.dll")] 
private static extern UInt32 SendInput(UInt32 nInputs,[MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] Input[] pInputs, Int32 cbSize); 

Также вы можете установить другое приложение на передний план:

[DllImport("User32.dll")] 
private static extern int SetForegroundWindow(IntPtr point); 

Затем вы получите процесс главного окна ручки приложения, что-то вроде этого:

var processes = Process.GetProcessesByName(processName); 
// Note that this line will get the first process with the given name: 
// if there are multiple, you will only get the first, and you should 
// also include a check that the array isn't empty! 
var handle = processes[0].MainWindowHandle; 

Тогда

SetForegroundwindow(handle); 
SendInput(....); 

Если вы хотите отправить ключи к игровым приложениям, им нужна дополнительная работа. В большинстве игр используется вход DirectX. Это в двух словах, если вам нужна более подробная информация, дайте мне знать.

Структуры и перечисления для использования с API вызова:

[StructLayout(LayoutKind.Sequential)] 
struct MouseInput 
{ 
    public int dx; 
    public int dy; 
    public int mouseData; 
    public int dwFlags; 
    public int time; 
    public IntPtr dwExtraInfo; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct KeyboardInput 
{ 
    public short wVk;  //Virtual KeyCode (not needed here) 
    public short wScan; //Directx Keycode 
    public int dwFlags; //This tells you what is use (Keyup, Keydown..) 
    public int time; 
    public IntPtr dwExtraInfo; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct HardwareInput 
{ 
    public int uMsg; 
    public short wParamL; 
    public short wParamH; 
} 

[StructLayout(LayoutKind.Explicit)] 
struct Input 
{ 
    [FieldOffset(0)] 
    public int type; 
    [FieldOffset(4)] 
    public MouseInput mi; 
    [FieldOffset(4)] 
    public KeyboardInput ki; 
    [FieldOffset(4)] 
    public HardwareInput hi; 
} 

[Flags] 
public enum KeyFlag 
{  
    KeyDown = 0x0000, 
    ExtendedKey = 0x0001, 
    KeyUp = 0x0002, 
    UniCode = 0x0004, 
    ScanCode = 0x0008 
} 
+0

Он также может использовать SendMessage в качестве альтернативы. http://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx – Bauss

+0

спасибо, это не игра .. Я попробую его – user1849432

+0

Ошибка Тип или название пространства имен ' Input 'не удалось найти (вы не указали директиву использования или ссылку на сборку?) - Я не знаю, почему это появляется? – user1849432

Смежные вопросы