我有这段代码:
const UInt32 WM_KEYDOWN = 0x0100;
const int VK_DOWN = 0x28;
const int VK_UP = 0x26;
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
private static Process GetProcessByHandle(IntPtr hwnd)
{
try
{
uint processID;
GetWindowThreadProcessId(hwnd, out processID);
return Process.GetProcessById((int)processID);
}
catch { return null; }
}
public static Process GetActiveProcess()
{
IntPtr hwnd = GetForegroundWindow();
return hwnd != null ? GetProcessByHandle(hwnd) : null;
}
public static void KeyUp()
{
PostMessage(GetActiveProcess().MainWindowHandle, WM_KEYDOWN, VK_UP, 0);
}
public static void KeyDown()
{
PostMessage(GetActiveProcess().MainWindowHandle, WM_KEYDOWN, VK_DOWN, 0);
}
当我调用KeyUp / KeyDown时,它仅适用于某些进程,如text editos,visual studio。
但不适用于Explorer.exe,iTunes.exe,Chrome.exe,Outlook.exe,FileZilla.exe等等。
我在控制台上运行调试:
while (true)
{
Process currentProcess = GetActiveProcess();
if (currentProcess != null)
Console.WriteLine(currentProcess.MainWindowTitle);
Thread.Sleep(1000);
}
这是我从某些应用程序中获得的:
ProjName - Microsoft Visual Studio (Administrator)
?PostMessage to Current Active Proccess doesn't work for all proccess ? - StackOverFlow - Google Chrome?
FileZilla
Inbox - Outlook Data File - Microsoft Outlook
在Explorer.exe上我得到空行..
答案 0 :(得分:2)
在Windows应用程序中有多种方法可以读取键盘状态,而对WM_KEYDOWN
和WM_KEYUP
的响应只是其中之一。应用程序还可以使用GetKeyState或GetAsyncKeyState。应用还可以回复WM_CHAR,WM_SYSKEYDOWN和WM_SYSKEYUP消息。不同的应用程序将使用不同的方法,如果您没有模拟应用程序正在寻找的方法,它将不会响应。
您所遇到的问题与Raymond所关联的问题中提出的问题略有不同,但解决方案可能相同。即使用SendInput而不是PostMessage