c# - 是否可以在没有 SetForegroundWindow 的情况下将 SendKeys 用于特定应用程序?
问题描述
在主屏幕上工作时,我想向 Firefox 发送一个右键单击命令,该命令在第二个垂直屏幕上打开。但我不希望 Firefox 在我发送命令时激活。我试过了,但没有用:
const uint WM_KEYDOWN = 0x0100;
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
private void button1_Click(object sender, EventArgs e)
{
var processes = Process.GetProcessesByName("firefox");
foreach (var proc in processes)
{
PostMessage(proc.MainWindowHandle, WM_KEYDOWN, (int)Keys.Right, 0);
// I have to use SendKeys.SendWait for the messages to be processed.
SendKeys.SendWait("{RIGHT}");
}
}
这可行,但每次我发送命令时,Firefox 都会激活。SetForegroundWindow
当我禁用该方法时它不起作用。
[DllImport("User32.dll")]
private static extern int SetForegroundWindow(IntPtr ptr);
private void button1_Click(object sender, EventArgs e)
{
var p = Process.GetProcessesByName("firefox").FirstOrDefault();
if (p != null)
{
IntPtr h = p.MainWindowHandle;
SetForegroundWindow(h);
SendKeys.SendWait("{RIGHT}");
}
}
解决方案
点击是一个WM_KEYDOWN
和WM_KEYUP
。您可以尝试使用第一种方法调用函数吗
foreach (var proc in processes)
{
PostMessage(proc.MainWindowHandle, WM_KEYDOWN, (int)Keys.RButton, (IntPtr)0x001E0001);
PostMessage(proc.MainWindowHandle, WM_KEYUP, (int)Keys.RButton, (IntPtr)0xC01E0001);
// I have to use SendKeys.SendWait for the messages to be processed.
SendKeys.SendWait("{RIGHT}"); //I dont believe you need this with the above approach
}
WM_CONTEXTMENU
如果这是您所追求的,您也可以尝试发送消息
我还必须指出,这Keys.Right
是Right
箭头键而不是鼠标右键,您应该Keys.RButton
使用
推荐阅读
- python - 捕获 Firebase 503 错误异常未捕获我的 try 语句
- java - Hbase 不适用于 spark-submit
- python - AttributeError:模块'tensorflow'没有属性'get_default_graph'python3
- javascript - 使用jQuery在html中附加字典
- forms - 在 Xamarin 窗体中显示 UWP 自定义控件
- angular - Observable 类型之间有什么区别
> vs 可观察的 在打字稿中? - swift - 在 Swift 中保存和检索不可编码为 Userdefaults 的结构
- sql - 用前一个单元格 sql 中的另一个值更新一个值
- html - 替换项目符号点
- 带有相应帖子中指定的图像
- excel - Excel Sumifs 索引匹配仅返回值