我尝试将Ctrl+Up
发送到非活动的Spotify窗口。虽然这对于每个应用都不是一种可靠的方法,但使用PostMessage
/ WM_KEYDOWN
的{{1}}确实有用......但只有在我的程序中首先使用它确实。在我自己的程序运行超过120毫秒后,没有任何反应。
在下面的repro中,Spotify没有做任何回应。
如果我删除程序顶部的WM_KEYUP
调用,或将其值降低到100以下,则Spotify会更改其音量以响应模拟输入。
值介于100和120之间时,它有时会起作用,有时也不会。
到底发生了什么,我该如何解决?
这是一个独立的复制品:
Thread.Sleep
其他观察:
using System;
using System.Linq;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
class Program {
static void Main(string[] args) {
// 0-100: Works reliably
// 101-119: Works some of the time
// 120+: Never works
Thread.Sleep(120);
var hWnd = Process.GetProcessesByName("spotify").Select(x => x.MainWindowHandle).FirstOrDefault(x => x != IntPtr.Zero);
PostMessage(hWnd, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(hWnd, WM_KEYDOWN, VK_UP, 0);
Thread.Sleep(1);
PostMessage(hWnd, WM_KEYUP, VK_UP, 0);
PostMessage(hWnd, WM_KEYUP, VK_CONTROL, 0);
}
public static readonly int WM_KEYDOWN = 0x100;
public static readonly int WM_KEYUP = 0x101;
public static readonly int WM_CHAR = 0x102;
public static readonly int VK_CONTROL = 0x11;
public static readonly int VK_UP = 0x26;
public static readonly int VK_DOWN = 0x28;
[DllImport("user32.DLL", EntryPoint = "PostMessage")]
public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, uint lParam);
}
始终返回PostMessage
1
值始终正确hWnd
" - 将4 Ctrl-Up
次调用置于PostMessage
循环内将多次正确增加音量