Unity:将密钥发送到后台窗口

时间:2019-06-25 01:11:46

标签: c# unity3d

我正在使用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。我不确定是什么原因造成的,因为应用程序正在运行并且没有被隐藏,因此任何建议都将不胜感激。

0 个答案:

没有答案