PostMessage仅在应用程序生命周期的前110毫秒内有效

时间:2018-02-11 20:33:49

标签: c# winapi pinvoke

我尝试将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循环内将多次正确增加音量
  • Repro是一个控制台应用程序,但我也看到了WinForms应用程序中的行为

0 个答案:

没有答案