如何使用AutoIt3将过程窗口置于最前面?

时间:2015-07-05 08:39:33

标签: c# .net winforms autoit

if (au3.WinExists(processName, "") == 0)
            {
                au3.Run(@"C:\Program Files (x86)\Paint.exe", "", au3.SW_SHOW);
                Thread.Sleep(10000);
                au3.MouseClick("LEFT", 358, 913, 1, -1);

            }
            else
            {
                au3.Run(@"C:\Program Files (x86)\Paint.exe", "", au3.SW_SHOW);
Thread.Sleep(10000);
                au3.MouseClick("LEFT", 358, 913, 1, -1);
            }

我使用的AutoIt3XClassAutoIt3XLib的一部分 所以我要检查过程是否存在。如果没有运行,它将显示在屏幕中央的正面。

问题是如果进程已经运行并且我想最大化它并将其带到屏幕中央的前面。

我在au3(AutoIt3XClass)找不到任何可以将其带到前面的属性。正在执行au3.Run将其置于最前面,但如果它已经在运行,我又不想再次运行它。

那么,也许au3有一个属性可以显示/把它带到前面?如果不是可能用其他方式把它带到前面?

2 个答案:

答案 0 :(得分:0)

<强>编辑:

如果进程正在运行,请将其置于最大化状态并执行鼠标单击。如果进程未运行,请运行进程并缓存它的id,按该id获取进程,将其置于前面并等待10秒再执行鼠标单击。我尝试了这个并按预期工作。

[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr handle);

[DllImport("User32.dll")]
private static extern bool ShowWindow(IntPtr handle, int nCmdShow);

private const int SW_SHOWMAXIMIZED = 3;

public static void BringToFront(IntPtr handle)
{
    if (handle == IntPtr.Zero)
        return;

    // Maximize window
    ShowWindow(handle, SW_SHOWMAXIMIZED);

    SetForegroundWindow(handle);
}

程序逻辑:

AutoItX3 au3 = new AutoItX3();

string processName = "mspaint";
Process[] processes = Process.GetProcessesByName(processName);

if (processes.Length == 0) // Process not running
{
    int processId = au3.Run(@"C:\Windows\System32\mspaint.exe", "", au3.SW_SHOW);
    Process process = Process.GetProcessById(processId);
    IntPtr handle = process.MainWindowHandle;
    BringToFront(handle);
    Thread.Sleep(10000);
    au3.MouseClick("LEFT", 358, 913, 1, -1);
}
else // Process running
{
    BringToFront(processes[0].MainWindowHandle);
    au3.MouseClick("LEFT", 358, 913, 1, -1);
}

答案 1 :(得分:0)

您应该使用ProcessExists而不是WinExsits。要将窗口置于最前面,可以使用WinActivate。