我想写一个虚拟键盘,就像触摸屏电脑的Windows屏幕键盘一样.但是我的虚拟键盘在使用正在使用的应用程序中窃取焦点时遇到了问题.即使用户点击它,Windows屏幕键盘也会将焦点集中在当前应用程序上.有没有办法在C#中使用Windows窗体做同样的事情?
我现在唯一能做的就是将键盘事件发送到特定的应用程序,例如以下代码中的记事本.如果我可以使表单不可聚焦,我可以使用GetForegroundWindow获取当前聚焦窗口.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
IntPtr calculatorHandle = FindWindow("notepad", null);
SetForegroundWindow(calculatorHandle);
SendKeys.SendWait("111");
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以做到这一点?有没有更好的方法让表格将键盘事件发送到正在使用的应用程序?
谢谢!!
我想在计时器停止时获取当前活动应用程序的名称.录制20秒后,它应显示当前活动的应用程序名称.我尝试了一些代码.你可以在这里看到.但是在计时器停止后它没有向我显示任何内容.
C#代码:
public class Win32wrapper
{
private System.Timers.Timer pingTimer;
private Timer recordTimer;
private List<HarvestApp.ProcessInformation> ProcessList = new List<HarvestApp.ProcessInformation>();
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
private DateTime recordStartTime;
public void startTimer(int pingTimerValue=5000, int recordTimerValue=20000)
{
pingTimer = new System.Timers.Timer(pingTimerValue);
pingTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
pingTimer.Interval = pingTimerValue;
pingTimer.Enabled = true;
recordTimer = new Timer(recordTimerValue);
recordTimer.Elapsed += new ElapsedEventHandler(OnRecordEvent);
recordTimer.Interval = recordTimerValue;
recordTimer.Enabled = true;
recordStartTime = DateTime.Now;
}
private void OnTimedEvent(object source, …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要获取最后一个活动窗口句柄的应用程序.假设我的应用程序正在运行,那么我想获取之前刚刚在我的应用程序之前打开的最后一个活动窗口句柄.
@ EDIT1:这不是重复的问题.我需要获取最后一个活动窗口的句柄而不是当前窗口.
我想使用Window Script Host(WSH)查找当前处于活动状态(具有焦点)的窗口的标题,因为我希望我的WSH脚本仅用于Sendkeys如果所需窗口处于活动状态.
注意*我没有条件使用替代方法,即在调用sendkeys之前激活所需的窗口.
任何帮助表示赞赏.
我想获得它在Windows上运行的当前应用程序的名称.
例如,如果我使用ie,此功能提供"Internet Explorer"或者如果我使用Google Chrome,请给Chrome ...
我想获得具有焦点的窗口的路径。
例如:我打开
了3 个窗口。C:\Windows
B. C:\Windows\System32
C. C:\用户\COMP-0\文档
我正在处理 c (C:\Users\COMP-0\Documents)
所以我想在 C# 中以编程方式获取此路径 (C:\Users\COMP-0\Documents)。
我正在处理与C#WinForms应用程序相关的错误,该应用程序以启动画面启动,然后关闭启动画面并打开登录表单.在某些电脑上一切正常.在其他情况下,会出现登录表单,但闪烁的标题栏会在几次闪烁之后完全失去焦点.光标仍在"用户名"文本框中闪烁,但应用程序没有焦点,当您开始输入时,没有任何反应,这对用户来说非常烦人.
操作系统运行似乎没有区别(我们已经尝试过Windows 7和Server 2008),并且在启动应用程序后我们特别没有任何键盘或鼠标输入.
现在 - 有没有人知道什么可能导致应用程序失去焦点?
或者,您将如何调试此问题?我们无法在Visual Studio调试环境中复制问题,但这并不让我感到惊讶,因为我猜这是编译的应用程序如何与操作系统交互的问题......或者我错了?
编辑#1:我认为这是由@vinodpthmn解决的,确保在登录表单出现之前正确关闭了启动画面,但这似乎没有帮助.所以我创建了一个记录器来跟踪所有事件和线程,并找到了以下有趣的日志条目:
Thread 01 - 2012/03/29 12:51:09.693 - Show splash screen
Thread 01 - 2012/03/29 12:51:20.350 - Splash screen closed
Thread 01 - 2012/03/29 12:51:20.490 - Login Form Activated
Thread 01 - 2012/03/29 12:51:20.522 - Login Form Load
Thread 01 - 2012/03/29 12:51:25.694 - Login Form deactivated
Thread 01 - 2012/03/29 12:51:25.694 - Active form =
Thread 01 - 2012/03/29 12:51:25.694 - Active app =
Run Code Online (Sandbox Code Playgroud)
显示活动表单和应用程序的最后一行分别显示Form.ActiveForm
和Windows中当前活动的应用程序(此处的代码).它们都是空的/无效的.即便如此,即使在登录表单中加载I调用Activate() …