【发布时间】:2014-11-01 07:25:13
【问题描述】:
问题
这是我在后台发送击键的功能。
class SendMessage
{
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
public static void sendKeystroke(string appName)
{
const int WM_KEYDOWN = 0x100;
IntPtr hWnd = FindWindow(null, appName);
IntPtr editx = FindWindowEx(hWnd, IntPtr.Zero, "edit", null);
PostMessage(editx, WM_KEYDOWN, (IntPtr)Keys.A, (IntPtr)0);
}
}
此代码适用于 notepad,例如 let appName = "notepad"。
但是,我可以在其他应用程序中做到这一点..我在 LINE 应用程序上练习。
正如你在图片中看到的lpszClass variable = "edit"(红色小圆圈)用于记事本。
我需要为 LINE 应用程序找到它,所以我使用 WinSpy++ 来捕获这些类名。
我发现它的类名是“ATL:00B53BE8”(大红色圆圈),我可以输入消息
在WinSpy++中回车,会出现Line文本框(蓝色圆圈)。
结论
我尝试将捕获类名称替换为“编辑”,但没有希望。
我不明白为什么捕获类名不可用,请帮助或给我一些提示。
我不知道可能是系统应用程序的层次结构不同(粉红色的)
而且我不知道 FindWindowEx 中的哪些参数意义重大。
我的最终目标是将击键发送到其他应用程序而不关注它们。
【问题讨论】:
-
您的问题是什么?就像这里经常出现的情况一样,输入伪造是使用 SendInput 完成的,而自动化是使用 UIAutomation 完成的。你为什么要这样黑客攻击?
-
黑客攻击???我只想在后台传递输入并找出一些解决方案,这似乎都有效
-
你在破解。为什么不使用我概述的首选解决方案?
-
因为它无法在没有焦点的情况下发送密钥,这是我所知道的。所以这不符合我的要求我想做其他窗口,同时让它在后台工作(发送密钥)到其他应用程序。
-
你应该使用 UIAutomation。它可以生成表示 GUI 的树形结构。 FindWindowEx 有据可查。您需要多次调用才能遍历父子层次结构。但这样的黑客行为不是前进的方向,我并不希望你,像你之前的许多人一样,接受这个建议。
标签: c# winapi interop findwindowex