我想将一个特定的密钥(例如k)发送到另一个名为notepad的程序,下面是我使用的代码:
void sendkey ()
{
[DllImport ("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);
Process p = Process.GetProcessesByName("notepad")[0];
IntPtr pointer = p.Handle;
SetForegroundWindow(pointer);
SendKeys.Send("k");
}
Run Code Online (Sandbox Code Playgroud)
但代码不起作用,代码有什么问题?
编辑:如果没有记事本作为活动窗口,我可以将"K"发送到记事本吗?(例如,活动窗口="Google Chrome",记事本位于背景中,这意味着将密钥发送到后台应用程序)
我正在制作一个全局捕获键盘输入的Windows应用程序.当用户使用应用程序使用的CTRL + ALT + G快捷键组合时
SendKey.Send(Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)
在任何文本字段中键入生成的GUID.无论应用程序采取何种输入,它都应该这样做.
当你第一次键入CTRL + ALT + G时,它的工作方式与我的预期完全相同,但后续尝试不会产生任何结果,或者只是非常罕见的成功.
我的意思是,这一切都应该非常简单和一致.我有一个工作的全局键盘钩子,它一直工作,我已经测试过,但SendKey.Send()方法不是每次都有效.
我看过Google的任何与我的问题相关的内容,但到目前为止还没有任何工作.
有人有任何见解吗?
编辑1:我也尝试过使用SendKey.SendWait(),做同样的事情.我真的想要一种更灵敏的方式来使用这种键盘快捷方式生成新的GUID.
编辑2:
以下是代码的基本部分:
/* Initialization Code Here */
// register the event that is fired after the key press.
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);
// register the control + alt + F12 combination as hot key.
hook.RegisterHotKey((uint)(HotkeyModifiers.Control | HotkeyModifiers.Alt), Keys.G);
Run Code Online (Sandbox Code Playgroud)
事件代码非常简单:
void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
SendKeys.SendWait(Guid.NewGuid().ToString());
}
Run Code Online (Sandbox Code Playgroud)
我项目中的其他任何事情都只是松懈.
更新1:
关于这个问题,我确实有更多的问题,但是今天我没有时间继续研究这个问题.我已经实现了Jon Raynor建议使用app.config方法取得一定程度的成功.一旦我解决了我的新问题,我将发布一个编辑,如果我的应用程序按预期运行,可能会关闭此问题.
目前我正在使用我的C#/ WPF应用程序打开文件
System.Diagnostics.Process.Start("C:\ .... ");
Run Code Online (Sandbox Code Playgroud)
应用程序窗口是否全屏等取决于应用程序的前一个实例在关闭时所处的状态(例如,如果在全屏时关闭它,则会全屏打开一个新实例)
我要做的是在Excel中打开一个文件并使其全屏显示.我查看了Excel的命令行开关,看起来相当有限,因为我无法通过添加Application.DisplayFullScreen = True到VBA模块来修改excel文件.
编辑:不清楚,但我打算在全屏模式下打开它(没有功能区等),没有最大化.
Edit2:键序列是alt+v,u.寻找一种方法来SendKeys将密钥序列发送到excel窗口
我试图弄清楚如何使我的C#应用程序将键发送到另一个应用程序窗口,而无需关注它。我有一个单词列表和3个记事本文件。想象一下,我依次打开了所有3个记事本窗口,我的程序将把列表框中的第一个单词写入第一个记事本窗口。第二个记事本窗口中的第二个单词,第三个记事本窗口中的第三个单词。然后重新开始并继续。因此,我希望它在每个单词中张贴1个字,然后一遍又一遍地继续下去。
但是我只想出了如何使用1个记事本窗口(同时处于活动状态)进行操作。
int i = 0;
i = listBox1.SelectedIndex;
i = i + 1;
if (i > listBox1.Items.Count - 1)
i = 0;
listBox1.SelectedIndex = i;
string message = listBox1.SelectedItem.ToString();
SendKeys.Send(message);
SendKeys.Send("{ENTER}");
Run Code Online (Sandbox Code Playgroud)
这将需要我首先将焦点放在记事本窗口上,启动计时器,然后再将焦点放在记事本窗口上。然后,它将仅遍历列表并键入单词(每行1个)。而且效果很好。但我希望能够在3个窗口上执行此操作。
然后我需要以某种方式获取窗口标题,而不是进程名称。我将有3个称为记事本的进程。但是,如果将它们分别命名为Note1,Note2,Note3,我该怎么做?
我需要帮助来列出要写入哪些程序的清单:
listofprograms = ["Note1", "Note2", "Note3"];
Run Code Online (Sandbox Code Playgroud)
然后它将找到使用这些名称打开的应用程序窗口,然后以某种方式将文本写入这些窗口。
有人可以帮我吗?到目前为止,尚未找到任何相关信息,请相信我,我环顾四周!