我正在使用Unity制作可自定义的屏幕键盘,但是在弄清楚如何使键盘将键发送到它后面的任何窗口时遇到麻烦。
我尝试使用经过稍微编辑的Louisbob's代码版本:
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。我不确定是什么原因造成的,因为应用程序正在运行并且没有被隐藏,因此任何建议都将不胜感激。