如何在我运行另一个进程后激活我的应用程序-C#

本文关键字:激活 我的 应用程序 -C# 进程 另一个 运行 | 更新日期: 2023-09-27 18:21:20

当文本框聚焦时,我正在运行一个虚拟键盘,但随后键盘应用程序聚焦,不会将键转移到文本框。如果我点击文本框激活它,一切都很好,但我希望我的应用程序在vKeyboard进程运行后被激活。这就是我迄今为止所尝试的:

        [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        vKeyboard = Process.Start(keyboardPath);
        SetFocusToApplication(handle);

        private static void SetFocusToApplication(IntPtr handle)
    {
        Process currentProcess = Process.GetCurrentProcess();
        IntPtr hWnd = currentProcess.MainWindowHandle;
        if (hWnd != IntPtr.Zero)
        {
            SetForegroundWindow(handle);
            ShowWindow(hWnd,3);
        }
    }

我也尝试过将Alt+Tab发送到键盘进程,但它不起作用:

        private static void AltTab(IntPtr handle)
    {
             vKeyboard.WaitForInputIdle(); 
       int WM_SYSCOMMAND = 0x0112;
        int SC_PREVWINDOW = 0xF050;
        PostMessage(vKeyboard.MainWindowHandle, WM_SYSCOMMAND, (IntPtr)SC_PREVWINDOW, (IntPtr)0);
    }

附言:我确实有虚拟键盘的源代码,如果我可以从那里做任何事情来停用它自己,仍然可以。让我知道。此外,键盘最上面的属性也设置为true,不确定这是否有任何不同。

这是我正在尝试并在按钮点击中工作的代码:

           Process vKeyboard;
      string keyboardPath = Application.StartupPath + "''vKeyboard.exe";
        vKeyboard = Process.Start(keyboardPath);

如何在我运行另一个进程后激活我的应用程序-C#

更改屏幕键盘的源代码,使表单具有WS_EX_NOACTIVATE标志:

public partial class OnScreenKeyboard : Form
{
    private const int WS_EX_NOACTIVATE = 0x08000000;
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams p = base.CreateParams;
            p.ExStyle |= WS_EX_NOACTIVATE;
            return p;
        }
    }
}

这将阻止OSK获得焦点,从而允许密钥以当前活动的应用程序为目标。

有关更多详细信息,请参阅上一个问题中的示例。

要将表单放在最前面,请使用:

this.Activate();

我尝试了以下代码,一切都很完美(我在Timer.Tick事件中编写了这段代码):

System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("osk");
if (proc.Length > 0)
{
    this.Activate();
    textBox1.Focus(); //i focused it so i can write in it using on-screen keyboard
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private void ActivateWindow()
{
    SetForegroundWindow(this.Handle);
}

有了这个代码,假设你在主应用程序窗口。如果没有,您将需要更改";CCD_ 2";通过主窗口的手柄。

要获得一个不需要编写p/Invoke代码的简单、可靠的选项,您可以从C#代码调用Microsoft.VisualBasic.Interaction.AppActivate(int processId)

using System.Diagnostics;
using System.Linq;
using Microsoft.VisualBasic;
...
Process? process = Process.GetProcessesByName("TextBoxProcessName").FirstOrDefault();
if (process != null)
{
    Interaction.AppActivate(process.Id);
}

在旧版.NET Framework.csproj文件中,您需要<Reference Include="Microsoft.VisualBasic" />。在现代.NET SDK.csproj文件中,您需要启用Desktop SDK并设置<UseWindowsForms>true</UseWindowsForms>

注意:我从这个相关的答案中发现了Interaction.AppActivate,这可能会给你其他的想法。