Я делаю настраиваемую экранную клавиатуру с Unity, но мне сложно понять, как заставить клавиатуру отправлять клавиши в любое окно позади нее.
Я пытался использовать слегка отредактированную версию кода Луисбоба:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
[SerializeField]
class SendMessages
{
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public static void sendKeystroke()
{
const uint WM_KEYDOWN = 0x0100;
const uint WM_KEYUP = 0x0101;
IntPtr hWnd;
string processName = "Notepad";
Process[] processList = Process.GetProcesses();
foreach (Process P in processList)
{
if (P.ProcessName.Equals(processName))
{
IntPtr edit = P.MainWindowHandle;
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.B), IntPtr.Zero);
}
}
}
}
public class B_Button : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.GetMouseButtonDown(0))
{
SendMessages.sendKeystroke();
}
}
}
Этот код не возвращает никаких ошибок, но когда я запускаю / собираю проект и нажимаю, в блокноте не появляется «B». Я делаю что-то не так или функция PostMessage не работает с Unity? Если это не работает, что еще я могу сделать, чтобы заставить эту программу работать?
Обновление
Я понял, что получить ручку на окне - это одна или единственная проблема. Я сделал
Process[] n = Process.GetProcessesByName("Notepad");
foreach (Process p in n)
{
hWnd = p.MainWindowHandle;
UnityEngine.Debug.Log(hWnd);
}
в нескольких запущенных программах, и он вернул 0 для обоих дескрипторов главного окна. Я не уверен, что является причиной этого, так как приложения работают, а не скрыты, поэтому любой совет будет принят.