Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行另一个进程后激活我的应用程序-C#_C#_.net_Process_Activation - Fatal编程技术网

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

如何在运行另一个进程后激活我的应用程序-C#,c#,.net,process,activation,C#,.net,Process,Activation,当文本框获得焦点时,我正在运行一个虚拟键盘,但随后键盘应用程序被聚焦,并且不会将键传输到文本框。 若我点击textbox激活它,一切都很好,但我希望我的应用程序在vKeyboard进程运行后被激活。 这就是我迄今为止所尝试的: [DllImport("user32.dll")] static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); [DllImpor

当文本框获得焦点时,我正在运行一个虚拟键盘,但随后键盘应用程序被聚焦,并且不会将键传输到文本框。 若我点击textbox激活它,一切都很好,但我希望我的应用程序在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);

我还尝试将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);
    }
PS:我确实有虚拟键盘的源代码,如果我可以从那里做任何事情来停用它,仍然可以。让我知道。 另外,键盘最顶端属性设置为true,不确定这是否有任何不同

这是我正在尝试和不使用的代码,单击按钮:

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

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

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


更改屏幕键盘的源代码,使窗体具有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获得焦点,从而允许键指向当前活动的应用程序

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

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

private void ActivateWindow()
{
    SetForegroundWindow(this.Handle);
}

有了这段代码,你就可以在主应用程序窗口中了。如果没有,您需要通过主窗口的句柄更改“
this.Handle
”。

这不是失去焦点的我的表单,而是整个申请过程。我希望应用程序获得焦点。应用程序是一个过程。如果您激活了它的一个线程(例如,多个表单中的一个表单),那么整个应用程序将处于焦点位置,那么您可以在表单之间导航。试试这个,它会有帮助。我确实在加载键盘进程后调用了这个方法,但它仍然没有激活我的应用程序或主窗体。谢谢,这会以这种方式工作,但由于某种原因,当我单击按钮时(这是我的应用程序中键盘进程的启动方式),它不再工作。有什么想法吗?我在点击按钮时启动计时器,在计时器滴答声运行一次时停止计时器。这会有用的,谢谢。但是如果我不需要定时器就可以完成,那就太好了。你编写虚拟键盘并可以访问源代码了吗?是的,我可以访问虚拟键盘源代码。为什么你要编写自己的虚拟键盘,而不是使用所有版本的Windows附带的屏幕键盘?它经过了很好的测试,一点焦点都没有。我想要一个没有ESC和Win键的键盘以及一些附加键。这是一个信息亭应用程序,所以我必须手动制作自己的。
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
}
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;
        }
    }

}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

private void ActivateWindow()
{
    SetForegroundWindow(this.Handle);
}