问题标签 [sendmessage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2916 浏览

c# - 在未激活的应用程序中模拟鼠标移动/单击/按键

我知道如何模拟鼠标和键盘事件,但它们的行为就像用户做了它们一样,所以它们会影响活动的窗口。我需要的是模拟其中一个输入,但在一个不活动的窗口中。

我并不是说它被最小化了,例如,想象一下,你有 msPaint 和记事本。记事本在油漆前面。并且您想在绘图窗口的某些坐标中模拟鼠标单击,但不将其设置为活动状态,从而使用户可以继续使用位于绘图前的记事本。

这可能吗?谢谢!

我试过这个:

但它不起作用 =( 什么都不做 :(

0 投票
5 回答
43465 浏览

c# - 我不明白如何使用 SendMessage 或 PostMessage 调用

我需要在第三方应用程序中模拟按键。假设我有一个需要向计算器应用程序发送“8”的 C# 应用程序。我不能使用 .Net 的 SendKeys 或 win32 api 的 keybd_event ,因为它们都要求窗口是最活跃的窗口,而我的情况并非如此。

这样就剩下调用 sendMessage 和 postMessage 了。在过去的三个小时里,我一直在尝试获得一些结果,但现在我完全没有希望了。

我有以下内容:

如您所见,我进行了四次尝试与计算器进行通信。使用 sendMessage 和 PostMessage 关闭窗口并发送密钥 7. 没有任何效果。FindWindow 方法有效,因为我得到了应用程序的处理程序(我什至尝试自己启动进程并使用 process.MainWindowHandler 访问它,但没有运气)。没有错误或异常,但它在计算器中没有任何作用。

我也用记事本尝试了完全相同的东西,也没有任何改变。

0 投票
1 回答
1972 浏览

delphi - 如何以编程方式在另一个应用程序中选择上下文菜单项?

目标应用程序是用 Delphi(win32 不是 .NET)编写的,并且是闭源的。

我要调用的操作称为复制,但没有明显的键盘快捷键。(Ctrl+Insert 做错事,Ctrl+C 什么也不做)

我可以找到我的目标HWND并说服它打开上下文菜单(它会响应WM_RBUTTONDOWN/UPnot WM_CONTEXTMENU)。从菜单HWND中我什至可以通过获取菜单句柄MN_GETHMENU并找到我想要的菜单项。我只是不知道如何“选择”项目的细节。菜单是“无模式的”并没有帮助,即。它HWND不属于自己,所以我不知道许多隐藏TPUtilWindow窗口中的哪个是真正的所有者 - 否则我可能只是发送它WM_COMMAND而不弹出菜单,这将是可取的。

尽管我确信它有助于各种黑客攻击,但我不希望将代码注入目标进程。

接受任何语言的答案。

0 投票
2 回答
1174 浏览

windows - 如何获取应用程序的活动子窗口?

我有这个问题。我有一个特定应用程序主窗口的处理程序,我想模拟该应用程序上的按键...

我正在使用 sendMessage/postMessage api 调用来执行此操作。我不使用 .Net SendKeys 函数或 win32 api 的 keybd_event 的原因是它们在全局级别模拟按键。就我而言,我可能已将应用程序最小化,但仍希望模拟按键。

sendMessage 和 postMessage 的问题在于,您必须传递要按下键的确切子窗口的处理程序。例如,在记事本中,如果我将密钥发送到主窗口,没有任何反应,我必须将密钥发送到基本上由白色画布组成的子窗口,您可以在其中进行书写。

以 msPaint 为例,如果用户创建一个新文档,并在该绘图中打开一个文本框,并且我想在那里模拟按键,我必须获取主窗口的子窗口的子窗口才能使其工作。

所以我找到了一种似乎适用于所有情况的方法,基本上,我使用带有参数 GW_CHILD 的 getWindow 来获取具有最高 z 值的子窗口。然后我为子窗口再次执行此操作并继续执行此操作,直到某个 childWindow 没有更多 childWindows..

它似乎奏效了,我很高兴!

但是......我发现这不起作用的情况。火狐就是其中之一。Firefox 有 mainWindow,然后有一个与 mainWindow 几乎相同的 childWindow,然后它还有另一个 childWindow,即网站区域,即地址栏和菜单下方的区域。例如,如果我在 www.google.com 上,并且我想在焦点搜索框中模拟按键,它会起作用,因为获取子窗口的子窗口会给我正确的 childWindow。但是,例如,如果用户单击地址栏,getWindow 的工作方式不会发生任何变化。它最终仍然会得到地址栏下的子窗口,什么都不做,而不是模拟地址栏上的按键。

问题是我还没有找到获取某个应用程序的活动子窗口的方法。我只能使用GetWindow方法来获取某个窗口的子窗口,直到找到没有子窗口的子窗口。但是,正如您在 firefox 案例中看到的那样,活动窗口实际上是我最终得到的子窗口的父级。

我尝试过其他 api 调用,如 getTopWindow 但我没有运气..

任何人都可以对这个问题有所了解吗?谢谢!

0 投票
2 回答
4703 浏览

c# - .NET 网络浏览器控制自动化

我正在尝试在我的 C# 程序的 webbrowser 控件中运行的 flash 游戏上自动化一些东西。使用 user32 的 sendmessage dll,我可以点击常规页面(如 google)上的坐标,但它不适用于 flash 内容。我有什么办法可以做到这一点?Flash游戏也无法检测到它。我在 autoit 中有一个工作,但我想用 c# 重写它并使其工作最小化。

0 投票
2 回答
4738 浏览

c++ - 从 DLL 向 Vista 中另一个进程中的窗口发送消息

我正在把头发拉出来。我正在尝试向另一个进程中的窗口发送消息。在调用 SendMessage 或 PostMessage 或 PostThreadMessage 后,我不断从 GetLastError() 获得访问被拒绝 (0x5)。我试过关闭UAC。我还通过确保完整性级别与跨进程匹配来说明 UIPI。(我使用 SysInternals 的 Process Explorer 进行了检查,现在是 MS)我也关闭了 Windows Defender,但没有运气。我可以从进程内部向窗口发送消息就好了,但是从外部我得到了bupkus!这似乎是某种安全问题,但我不知道它是什么,因为两个进程具有相同的完整性级别(中 - 十进制 8192)

来自 DLL 的代码发送消息

从接收窗口中选择的代码

0 投票
6 回答
4510 浏览

c++ - 在线程之间发送字符串数据(Win32)

这是一个相当简单的问题,我基本上是在寻找一种“最佳实践”方法来解决我正在尝试做的事情。

我有一个 Win32 GUI 应用程序,它启动一个工作线程来执行一堆阻塞调用。我希望这个线程将字符串消息发送回 GUI,以便将它们显示给用户。

目前我认为使用 SendMessage 将是一个好方法,使用 WM_COPYDATA? 这是在正确的轨道上吗?我最初确实有一个线程安全队列类,它将简单的通知消息发送回 GUI 线程,然后将字符串从队列中弹出。然而我很快后退了一步,意识到我不需要排队。我可以直接发送字符串。

有小费吗?谢谢!

编辑:为了完整起见,我使用的是 C++。

0 投票
4 回答
3259 浏览

c++ - 双击列表视图(c++,不是 .net!)

我想双击一个列表视图。从我在 msdn 上读到的内容看来,我必须发送一条 WM_NOTIFY 消息和带有 NM_DBLCLK 的东西。但我不太了解如何实施它。我之前使用过 SendMessage,但 MSDN 并不清楚如何填充结构,因此:

WM_NOTIFY http://msdn.microsoft.com/en-us/library/bb775583(VS.85).aspx NM_DBLCLK http://msdn.microsoft.com/en-us/library/bb774867(VS.85).aspx

0 投票
4 回答
2716 浏览

c++ - 设置另一个程序的列表视图选定项

我希望能够选择在另一个程序的列表视图中选择了哪个项目(我无权访问它的代码)。实际上,它是一个 SysListView32,我认为它是相同的。我已经有以下代码,不幸的是,尽管编译,但似乎什么也没做(尽管 SendMessage() 返回 1)。

0 投票
3 回答
2265 浏览

vba - 如何将点击或按键从 VB6 应用程序发送到 Excel 对话框?

我的雇主从 Conveter Technology 购买了第三方工具 OfficeConverter,它可以自动将 Office 2003 格式的文件转换/修复为 Office 2007 格式。该工具还可以高度自动化 Office 2003 和 2007 格式之间的宏/VBA 代码要求的翻译/更改。

我的问题是,在此转换过程中,该工具正在打开目标 Office 产品,例如 Excel,然后打开目标用户文件(即 Report.xls),然后检查任何 VBA / 宏代码的更改要求。问题是如果 Excel 文件代码依赖于某些外部工具,如 .OCX 文件,并且如果我正在执行此操作的 PC 上不存在该工具,Excel 将弹出一条消息,指出该对象具有未找到,停止整个转换过程(连续数千个文件),直到有人出现并手动单击相应的按钮以关闭对话框。

我认为在 VB6 中创建一个小型监视应用程序(嘿,我老了,我的技能也一样)可以坐在同一台 PC 上并监视这些对话框,并根据具体消息,通过 SendMessage 单击适当的按钮API 调用。

问题是我无法让 SendMessage 真正为我按下按钮,我尝试向它发送返回键值 (vbKeyReturn) 甚至空格键 (vbKeySpace) 但该操作从未导致对话盒子应有的关闭。我可以将焦点放在对话框上启用的任何按钮之间的选项卡上,但仅此而已。

我曾尝试使用 SendKeys,但在我遇到的当前文档中,它的可靠性要低得多,并且强烈建议不要这样做。

有什么建议么?:)