在使用发送消息时无法触发文本更改事件,WM_SETTEXT但PostMessage可以
本文关键字:WM 事件 SETTEXT 可以 PostMessage 文本 消息 | 更新日期: 2023-09-27 18:34:21
我有一个类似的问题,但我仍然无法解决它。
我正在尝试从我的 wpf 程序编辑一个文本框以用于对比度,另一个用于在图像查看器程序中编辑亮度的文本框。更改这两个文本框中的值将立即触发图像的更改。使用 Spy++ 可以让我获得这两个文本框的确切窗口句柄,我已经尝试了以下方法,但仍然无法从我的 C# 程序中获取我需要的东西。
方法一:此方法允许我立即更改文本框的整个文本,但更改不会自动触发并在图像查看器中反映图像的对比度/亮度变化。
IntPtr text = Marshal.StringToCoTaskMemUni(value.ToString());
SendMessage(window, WM_SETTEXT, 0, text);
Marshal.FreeCoTaskMem(text);
方法2:此方法获取文本框的 RECT 位置,手动设置鼠标单击该文本框,然后连续发送特定数字的键(例如,对比度值 100 将发送 3 次键,数字 1 的 vk 一次,数字 0 两次(。此方法将成功更改文本框中的文本,并在输入每个数字时触发对比事件。问题是图像会随着数字的每个输入而变化。图像反射到key1的第一个输入(对比度为1(,然后是key0(对比度为10(,最后是另一个key0(对比度为100,我们想要的实际对比度(。
RECT hwnd_loc = new RECT();
GetWindowRect(w_hwnd, ref hwnd_loc);
IntPtr lParam = (IntPtr)(((hwnd_loc.Top + 2) << 16) | (hwnd_loc.Left + 2));
PostMessage(w_hwnd, WM_LBUTTONDOWN, 0, (int)lParam);
PostMessage(w_hwnd, WM_LBUTTONUP, 0, (int)lParam);
for (int i = index.Count - 1; i >= 0; i--)
{
PostMessage(w_hwnd, WM_KEYDOWN, key[index.ElementAt(i)], 0);
}
那么有没有办法在不使用WM_keydown的情况下发布整组数字,或者是否有办法使用 SendMessage 但以某种方式允许图像查看器程序看到更改并触发对比度事件?任何帮助将不胜感激!
这主要不在你手中。 似乎有问题的应用程序仅在调用更新预览时对WM_KEYDOWN事件做出反应。
您可以尝试使用WM_SETTEXT设置文本,然后发送WM_KEYDOWN作为某种无操作(如向右箭头键或其他方式(。 这是假设有问题的代码只是写成"等待WM_KEYDOWN事件,然后解析文本框的文本"。