C# // SendKeys.SendWait仅在进程窗口最小化时才起作用

7
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;


namespace TextSendKeys
{
    class Program
    {
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        static void Main(string[] args)
        {
            Process[] processes = Process.GetProcessesByName("game");
            Process game1 = processes[0];


            IntPtr p = game1.MainWindowHandle;

            ShowWindow(p,1);
            SendKeys.SendWait("{DOWN}");
            Thread.Sleep(1000);
            SendKeys.SendWait("{DOWN}");



        }
    }
}

这个程序应该在游戏窗口中发送两次向下按钮。只有当我的窗口最小化时,它才能正常工作(它会激活窗口并完成任务)。如果我的窗口被激活(没有最小化),什么都不会发生。如何解决这个问题?

谢谢!:)


你需要窗口吗?如果你不是真的需要窗口,可以尝试创建一个控制台程序。 - Sandeep Datta
在使用控制台应用程序时,出现了“当前上下文中不存在'SendKeys'名称”的错误。我该如何解决这个错误?@Autodidact - chandu komati
1个回答

12

尝试使用 SetForegroundWindow Win32 API 调用,而不是 ShowWindow ,来激活游戏窗口。(签名来自于pinvoke.net。)

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

static void Main(string[] args)
{
    Process[] processes = Process.GetProcessesByName("game");
    Process game1 = processes[0];

    IntPtr p = game1.MainWindowHandle;

    SetForegroundWindow(p);
    SendKeys.SendWait("{DOWN}");
    Thread.Sleep(1000);
    SendKeys.SendWait("{DOWN}");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接