使用sendmessage和WM_SETTEXT时,不能触发textchanged事件,但PostMessage可以

时间:2013-10-07 19:56:24

标签: c# wpf sendmessage settext postmessage

我遇到类似于this的问题,但我仍然无法解决。

我正在尝试编辑一个用于对比度的文本框,另一个用于编辑来自我的wpf程序的图像查看器程序中的亮度。更改这两个文本框内的值将立即触发图像更改。使用Spy ++可以让我获得这两个文本框的确切窗口句柄,我尝试了以下方法,但仍然无法从我的C#程序中得到我需要的东西。

方法1: 此方法允许我立即更改文本框的整个文本,但更改不会自动触发并反映图像查看器中图像的对比度/亮度变化。

IntPtr text = Marshal.StringToCoTaskMemUni(value.ToString());
SendMessage(window, WM_SETTEXT, 0, text);
Marshal.FreeCoTaskMem(text);

方法2: 此方法获取文本框的RECT位置,手动设置鼠标以单击该文本框,然后连续发送特定数字的键(例如,对比度值100将使用vk发送keydown 3次,数字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但是某种方式允许图像查看器程序看到变化并触发对比事件?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这主要是在你手中。似乎有问题的应用程序仅在调用更新预览时对WM_KEYDOWN事件作出反应。

您可以尝试使用WM_SETTEXT设置文本,然后将WM_KEYDOWN作为一种无操作发送(如右箭头键或其他内容)。这假设有问题的代码只写为“等待WM_KEYDOWN事件,然后解析文本框的文本。”