我有一个类似的问题,但我仍然无法解决。
我正在尝试在我的 wpf 程序的图像查看器程序中编辑一个用于对比度的文本框和另一个用于亮度的文本框。更改这两个文本框中的值将立即触发图像的更改。使用 Spy++ 可以让我获得这两个文本框的确切窗口句柄,并且我尝试了以下这些方法,但仍然无法从我的 C# 程序中获得我需要的东西。
方法1: 此方法允许我立即更改文本框的整个文本,但更改不会自动触发并反映图像查看器中图像的对比度/亮度变化。
IntPtr text = Marshal.StringToCoTaskMemUni(value.ToString());
SendMessage(window, WM_SETTEXT, 0, text);
Marshal.FreeCoTaskMem(text);
方法2: 此方法获取文本框的RECT位置,手动设置鼠标点击该文本框,然后连续发送特定数字的键(例如,对比度值100将发送keydown 3次vk为数字1一次和数字 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);
}
那么有没有办法 PostMessage 不使用 WM_keydown 的整个数字集,或者是否有办法使用 SendMessage 但以某种方式允许图像查看器程序看到变化并触发对比事件?任何帮助将不胜感激!