如何在运行另一个进程后激活我的应用程序-C#
当文本框获得焦点时,我正在运行一个虚拟键盘,但随后键盘应用程序被聚焦,并且不会将键传输到文本框。 若我点击textbox激活它,一切都很好,但我希望我的应用程序在vKeyboard进程运行后被激活。 这就是我迄今为止所尝试的:如何在运行另一个进程后激活我的应用程序-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
[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);
}