- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 C# 中执行以下操作:
这是我得到的
Process p = new Process();
p.StartInfo.Filename = "notepad.exe";
p.Start();
// use the user32.dll SetForegroundWindow method
SetForegroundWindow( p.MainWindowHandle ); // make sure notepad has focus
SendKeys.SendWait( "some text" );
SendKeys.SendWait( "%f" ); // send ALT+f
SendKeys.SendWait( "x" ); // send x = exit
// a confirmation dialog appears
所有这一切都按预期工作,但现在在我发送 ALT+f+x 后我得到了“你想保存更改为无标题”对话框,我想从内部关闭它我的应用程序通过“按”'n'表示“不保存”。然而
SendKeys.SendWait( "n" );
仅当我的应用程序没有失去焦点时(在 ALT+f+x 之后)才有效。如果是这样,我会尝试返回使用
SetForegroundWindow( p.MainWindowHandle );
这会将焦点设置到主记事本窗口而不是确认对话框。我使用了 user32.dll 中的 GetForegroundWindow
方法,发现对话框句柄与记事本句柄不同(这有点道理)但是 SetForegroundWindow
甚至无法使用使用对话框窗口句柄
知道如何将焦点返回到对话框以便成功使用 SendKeys
吗?
完整代码
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("User32.DLL")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public const int SW_RESTORE = 9;
...
Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.Start();
Thread.Sleep( 1000 );
SendKeys.SendWait( "some text" );
SendKeys.SendWait( "%f" ); // send ALT+F
SendKeys.SendWait( "x" ); // send x = exit
IntPtr dialogHandle = GetForegroundWindow();
System.Diagnostics.Trace.WriteLine( "notepad handle: " + p.MainWindowHandle );
System.Diagnostics.Trace.WriteLine( "dialog handle: " + dialogHandle );
Thread.Sleep( 5000 ); // switch to a different application to lose focus
SetForegroundWindow( p.MainWindowHandle );
ShowWindow( dialogHandle, SW_RESTORE );
Thread.Sleep( 1000 );
SendKeys.SendWait( "n" );
谢谢
最佳答案
您不能提供您没有的东西 - SetForegroundWindow()
仅在您的应用程序当前具有焦点时才有效。
现代 Windows 版本防止应用程序窃取焦点,因为这在 Windows 9x 时代是一个主要的烦恼。
此外,'Alt+F, x' 仅指在英语 Windows 版本上退出,它不适用于大多数其他语言。避免使用 SendKeys()
,它不可能以可靠的方式使用。
关于C# SendKeys.SendWait 到另一个进程的对话框 (notepad.exe),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9314524/
我正在尝试制作一个将 key 发送到外部应用程序的应用程序,在本例中为 aerofly FS。我以前成功使用过 SendKeys.SendWait() 方法,但是这一次,它并没有完全按照我想要的方式工
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C
我想在后台从我的应用程序中复制事件应用程序中的选定文本。我使用 SendKeys.SendWait()。但我有时会遇到一个问题:一段时间后,我的应用程序只发送“c”而没有“CTRL”(至少只有“c”进
在 C# 中是 SendKeys.SendWait("{TAB}"); java中那是什么? (发送 TAB 键击)? 我在java中找不到真正的答案,java文档也不知道我在问什么。 (我注意到条款
SendKeys.SendWait() 只是一个包装器,这两个代码片段是相同的吗? const int VK_ESCAPE = 0x1B; keybd_event(VK_ESCAPE, 0, 0, 0
我正在尝试在 C# 中执行以下操作: 打开一个新进程(notepad.exe) 输入一些文本(使用 SendKeys) 关闭记事本(处理任何确认对话框) 这是我得到的 Process p = new
我想弄清楚如何将字符“^”(不是 CTRL 命令)发送到外部文本窗口。 我试过的不同代码: SendKeys.SendWait("^"); SendKeys.SendWait("(^)"); Send
我正在使用 SendKeys.SendWait 向其他正在运行的应用程序发送击键。但如果目标应用程序没有最小化,它就不起作用。这种方法有什么问题吗?将击键发送到正在运行的应用程序的其他方法有哪些。 我
我想知道如何使用 SendKeys.send(); 发送 空格键它可以与其他键一起使用,但只能与空格键一起使用!! 这是我找到其他键的链接 http://msdn.microsoft.com/en-u
我试图在按下 C 的同时按住 CTRL,但无法正常工作。我读过 SendKeys Class但是,它仍然不起作用。 这就是我尝试过的: SendKeys.SendWait("^C"); SendKey
我编写了一个程序来将“Enter”键发送到某个事件窗口。我使用 Timer 获取当前事件窗口的标题并采取相应行动。我做了一个错误日志文件,所以我可以跟踪所有的错误。这是造成错误的代码: pri
我的表单上有一个 Timer 控件,带有以下 Tick 事件处理程序: private void timer1_Tick(object sender, EventArgs e) { forea
我是一名优秀的程序员,十分优秀!