1

Нужно чтоб в другую программу имитировался ввод с клавиатуры, на оф сайте написано как это можно сделать, но почемуто так не работает.
В Spy++ показывает это:
Окно Spy++

Пишу вот так:

IntPtr calculatorHandle = FindWindow("Windows.UI.Core.CoreWindow", "Калькулятор");

// Verify that Calculator is a running process.
if (calculatorHandle == IntPtr.Zero)
{
    MessageBox.Show("Calculator is not running.");
    return;
}

// Make Calculator the foreground application and send it 
// a set of calculations.
SetForegroundWindow(calculatorHandle);
SendKeys.SendWait("111");

но выдает ошибку что калькулятор не найден, подскажите что я делаю не так.

Windows 10 Pro 1909 x64
Spy++ 16.00.29428 (выпуск x86)
Калькулятор 10.1910.0.0 x64

UndefFox
  • 171
  • Странно, вроде нормальный вопрос, воспроизводимый. А никто не отвечает. Добавьте информацию о версии ОС – 4per Jan 29 '20 at 04:25
  • @4per вы имеете в виду информации о версиях приложений и ОC? – UndefFox Jan 29 '20 at 18:45
  • У меня операционная система Windows 7, а у вас? – 4per Jan 29 '20 at 23:22
  • У меня класс у окна калькулятора CalcFrame – 4per Jan 29 '20 at 23:24
  • @4per или 8-ка или 10-ка у ТС'а – Dmitrii Jan 29 '20 at 23:46
  • 1
    А разрядность приложения совпадает с разрядностью приложения, которое используется для поиска? А то, например, в AutoIt(Скриптовый язык для этих целей) есть 2 версии под х64 и х86, что как мне кажется может быть не с проста. Может быть еще проблема в том, что вы можете использовать программу для поиска х86, а ОС ваша х64. – iluxa1810 Jan 30 '20 at 06:50
  • @4per добавил то что нужно? – UndefFox Feb 03 '20 at 17:05
  • @NeulovimFox, Вроде, да. А х64 Spy++ вы не можете попробовать, как пишет iluxa1810 ? А ещё обратите внимание на https://ru.stackoverflow.com/questions/1075131/%d0%98%d0%bc%d0%b8%d1%82%d0%b0%d1%86%d0%b8%d1%8f-%d0%b2%d0%b2%d0%be%d0%b4%d0%b0-%d1%81-%d0%ba%d0%bb%d0%b0%d0%b2%d0%b8%d0%b0%d1%82%d1%83%d1%80%d1%8b-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d0%be%d0%bc-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b8?noredirect=1#comment1848124_1076096 – 4per Feb 03 '20 at 23:08
  • @Andrew не совсем, там вопрос про консольное приложение с имитацией ввода которой проблем нет, а калькулятор системное приложение, и там все работает по другому принципу. Вопрос в том, как к таким приложениям обращаться на примере калькулятора/ – UndefFox Jan 28 '22 at 07:03
  • @UndefFox А ты пробовал тот код применить на калькуляторе? Нет? Нет никакой разницы. Посылай в калькулятор нажатия цифр и спецсимволов. Если что - консоль это тоже системное приложение. По-другому принципу работают разве что программы с веб-интерфейсом и видеоигры. А разницы между консольным приложением или блокнотом и калькулятором(работающим по горячим клавишам в т.ч.) особой нет. Это дубликат. – Andrew Stop_RU_war_in_UA Jan 28 '22 at 09:02

2 Answers2

0

Когда-то давно, в древние времена, я для этого использовал функции WinAPI SendMessage и PostMessage (отличия). Они позволяют отправить окну любое сообщение, в т.ч. и нажатия клавиш.

Возможно для реализации под .NET есть какие-то ограничения, связанные с работой фреймворка.

  • PostMessage не является надежным способом для имитации клавиатурного ввода: https://devblogs.microsoft.com/oldnewthing/20050530-11/?p=35513 SendKeys в C# использует Journal Hooks, которые работают чуть лучше, но ненамного. Поддерживаемый способ имитации клавиатурного в ввода в .NET - это UI Automation, но и он конечно не позволяет надежно имитировать ввод в любое приложения, потому что эта задача просто неразрешима (если не входить в область написания собственных драйверов клавиатуры). – MSDN.WhiteKnight Jan 30 '20 at 06:44
  • @MSDN.WhiteKnight Ну у ТС (пока) проблема не с отправить, а взять дескриптор окна – 4per Jan 30 '20 at 06:52
  • @4per а в разрядности проблема не может быть? Ведь Intptr'ы, вроде, от разрядности к разрядности разные => если приложения поиска одной разрядности, а ОС другой, то не может невалидный дескриптор возвращаться и все такое? – iluxa1810 Jan 30 '20 at 06:54
0

Посмотри вот здесь:

https://github.com/kurumpa/dotSwitcher - это аналог пунто на c#

https://habr.com/ru/post/482644/ - реализация кейлоггера

polsok
  • 1,473
  • 1
  • 17
  • 33
  • 1
    ответы ссылками для даного ресурса -- плохая практика. Необходимо изменить ответ так что бы здесь был код в ответе или же конвертировать ответ в комментарий – Andrew Stop_RU_war_in_UA Jan 26 '22 at 09:17