Member 12904911 Ответов: 1

Пожалуйста, помогите с преобразованием кода из 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

Большое спасибо. Я посмотрю и дам вам знать, если у меня возникнут дополнительные вопросы.

1 Ответов

Рейтинг:
0

johannesnestler

Ну и что? код, который вы показали, имеет 3 вызова Windows-API, которые точно так же вызываются C# (для C# это вызов через платформу-Invoke (PInvoke) - то же самое, что и в Python. Чем у тебя есть .Чистый вызов системы.Нарезание резьбы.Нить.Сон(Миллисекунды).
В то время вы писали все ... комментарии здесь вы могли бы закончить эти 4 строки кода-нет? Вы не знаете C#, но хотите написать код, который не имеет к нему никакого отношения .NET framework-просто вызов внешнего API C++ - затем пройдите простой учебник по C# или прочтите о необходимых функциях в MSDN - как вы это сделали в Python? Дает ли ваш код какие-либо знания о Python? Нет, вы просто должны знать Win32-API - как в C#.