Пожалуйста, помогите с преобразованием кода из Python в C# и некоторой дополнительной помощью
Всем привет. Я пытаюсь написать простую программу на c#, но все учебники и фрагменты в сети не работают для меня(у меня есть только очень базовые знания C#). Я пришел к вам, ребята, за помощью, если это возможно, пожалуйста.
То, что я пытаюсь сделать, - это отправить некоторое нажатие клавиши приложению в фоновом режиме (остальная часть компьютера должна быть пригодна для использования ) на основе либо pid приложения, либо имени. Вот тут-то и начинается самое трудное (если основываться на названии) Я хотел бы открыть несколько одинаковых приложений, и, очевидно, они будут иметь одно и то же имя, поэтому обходной путь, который я считаю, будет заключаться в том, чтобы просто отправить одни и те же ключи всем окнам с этим именем.
Я публикую ниже свой первоначальный код из Python, который, как я знаю, работает, но хотел бы преобразовать его в C#. Кроме того, я хотел бы, чтобы программа имела 2 кнопки для запуска и остановки, ничего особенного, просто базовое приложение form1 будет делать. Вот код:
#you will need the win32 libraries for this snippet of code to work, Links below import win32gui import win32con import win32api from time import sleep #[hwnd] No matter what people tell you, this is the handle meaning unique ID, #["Notepad"] This is the application main/parent name, an easy way to check for examples is in Task Manager #["test - Notepad"] This is the application sub/child name, an easy way to check for examples is in Task Manager clicking dropdown arrow #hwndMain = win32gui.FindWindow("Notepad", "test - Notepad") this returns the main/parent Unique ID hwndMain = win32gui.FindWindow("Notepad", "test - Notepad") #["hwndMain"] this is the main/parent Unique ID used to get the sub/child Unique ID #[win32con.GW_CHILD] I havent tested it full, but this DOES get a sub/child Unique ID, if there are multiple you'd have too loop through it, or look for other documention, or i may edit this at some point ;) #hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD) this returns the sub/child Unique ID hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD) #print(hwndMain) #you can use this to see main/parent Unique ID #print(hwndChild) #you can use this to see sub/child Unique ID #While(True) Will always run and continue to run indefinitely while(True): #[hwndChild] this is the Unique ID of the sub/child application/proccess #[win32con.WM_CHAR] This sets what PostMessage Expects for input theres KeyDown and KeyUp as well #[0x44] hex code for D #[0]No clue, good luck! #temp = win32api.PostMessage(hwndChild, win32con.WM_CHAR, 0x44, 0) returns key sent temp = win32api.PostMessage(hwndChild, win32con.WM_CHAR, 0x44, 0) #print(temp) prints the returned value of temp, into the console print(temp) #sleep(1) this waits 1 second before looping through again sleep(1)
Что я уже пробовал:
Я перепробовал почти все Youtube или первые страницы Google tutorials, но ничто не может сделать именно то, что я описал выше, пожалуйста, помогите!
[no name]
Хорошо, так что же вы хотите, чтобы мы сделали для вас? Мы не собираемся писать ваш код для вас, и мы не являемся службой перевода кода.
Member 12904911
Вау, это хороший прием в сообщество, которое я попробовал в первый раз.... я никогда не просил вас написать весь код для меня, а скорее указать мне правильное направление:
какие библиотеки мне нужны? Как подойти к проблеме? Подобные вещи
Будем надеяться, что большинство людей здесь не такие, как ты....
Dave Kreskowiak
Вы не сказали, в чем проблема, и не задали вопроса, так что я понятия не имею, что вы ищете.
Member 12904911
Извините, я думал, что упомянул об этом выше. Я пытаюсь имитировать нажатия клавиш в фоновом приложении. И хотя я знаю, как это сделать в python, я бы с удовольствием сделал это в c#, но никогда раньше не касался этого языка. Просто хочу сделать красивую маленькую форму с кнопкой start и stop и имитировать нажатие 1,2,3, например, в фоновом приложении.
Dave Kreskowiak
Это не описание проблемы. Это описание того, что вы хотите сделать. Просто оставив все как есть, вы не получите никаких указаний на то, с чем именно у вас возникли проблемы, кроме как "я не знаю C# или Windows development".
Чтобы отправить ключи в окно, которое в данный момент не имеет фокуса ввода, вы должны отправить сообщения непосредственно в дескриптор окна, на которое вы нацеливаетесь. Это то, что делает ваш код Python.
Проблема для вас заключается в преобразовании этого кода в C#, определении и настройке вызовов функций в Win32 и определении всех констант, которые использует этот код.
Вы можете проверить PInvoke.net для определения вызовов функций в Win32. У вас уже есть имена функций для использования в вашем коде Python: FindWindow, GetWindow и PostMessage.
[no name]
"Это хороший прием", да, это было приятно. Если бы я был груб или противен, вы бы это знали.
"но чтобы скорее указать мне правильное направление", - нет, вы ничего такого не делали. Вы, грубо говоря, попросили нас выполнить для вас работу бесплатно.
Вы никогда не задавали вопросов и не описывали проблем. Держу пари, вы даже не потрудились прочитать руководство по размещению.
- а какие свободы мне нужны? Как подойти к проблеме? Такие вещи", доказательство того, что вы не утруждали себя чтением рекомендаций по размещению сообщений, которые были прямо перед вами, когда вы писали свой не-вопрос. "Как мне написать все мое приложение" и "научите меня программированию в постинге на форуме" - это слишком широкая тема, поэтому она № 2 о том, что не следует спрашивать, как указано в FAQ, который вы не читали.
"Будем надеяться, что большинство людей здесь не такие, как вы...", если вы имеете в виду, что знаете, как задать вопрос, знаете, как ответить на вопрос и как использовать поисковую систему для поиска информации. Нет, таких, как я, совсем немного. Слишком много людей, которые не знают, как задать вопрос, прочитать или провести собственное исследование.
gggustafson
Я хотел бы предложить, что вы смотрите в вызов PInvoke (http://www.pinvoke.net/index.aspx). Я использую сайт для определения правильных параметров функций Win32 (таких как FindWindow и т. д.). Вы должны включить " using System. Runtime.InteropServices". Посмотрите на сайт PInvoke. Если у вас есть еще вопросы, ответьте на этот комментарий.
Member 12904911
Большое спасибо. Я посмотрю и дам вам знать, если у меня возникнут дополнительные вопросы.