Yount_0701 Ответов: 2

Моделировать wm_char сообщение , отправить мульти-байт


некоторые азиатские слова имеют многобайтовые значения , я пытаюсь смоделировать сообщение wm_char для отправки этих слов , но потерпел неудачу , даже используя двоичные байты.

Есть ли другой способ справиться с этим ?

Что я уже пробовал:

подобный этому :

PostMessage(ctrl_info.ctrl_hwnd , WM_CHAR ,0xbac3,0)


это фрагмент кода отправки моделирования wm_char в элемент управления редактированием блокнота, я сохранил Блокнот ,узнав, что сообщение 0xbac3 было разделено на 0xc300 и 0xba00

Jochen Arndt

WM_CHAR ожидает символ Unicode в пареметре wParam.

То, что в конечном итоге записывается в файл блокнотом, зависит от кодировки файла, который по умолчанию является кодовой страницей текущего пользователя, но может быть изменен для новых файлов и оставлен неизменным с существующими файлами Unicode.

Если вы найдете те же байты, что и переданные (0xC3 и 0xBA соответственно). 0XBAC3) в файле, вероятно, вы сохранили файл с кодировкой UTF-16.

Yount_0701

это правда. операция сохранения выскочила из диалогового окна , я выбрал кодировку utf-16.
Но я не уверен, что вы имеете в виду "WM_CHAR ожидает символ Unicode в пареметре wParam." Я использую двоичный код 0xbac3,это должно быть слово unicode,но вид в блокноте приводит меня в замешательство, это просто какие-то случайные символы.

Yount_0701

Это правда. операция сохранения выскочила из диалогового окна , я выбрал кодировку utf-16.
Но я не уверен, что вы имеете в виду "WM_CHAR ожидает символ Unicode в пареметре wParam." Я использую двоичный код 0xbac3,это должно быть слово unicode,но вид в блокноте приводит меня в замешательство, это просто какие-то случайные символы.

Richard MacCutchan

Это происходит потому, что блокнот использует английский набор символов, поэтому он не понимает коды Юникода, которые вы ему отправляете.

Richard MacCutchan

Вы на самом деле не объяснили, какую проблему пытаетесь решить. Но мне приходит в голову, что, скорее всего, есть гораздо более простое решение, чем отправка сообщений WM_CHAR в блокнот.

2 Ответов

Рейтинг:
1

Ron Anders

Может быть, посмотрите сюда?

windows - WM_CHAR send unicode character - переполнение стека[^][^]


Yount_0701

SendInput в порядке, здесь я отправляю какой-то код:

#включить <afx.h>

void SendAscii(wchar_t data, BOOL shift);
void SendUnicode(данные wchar_t);
void SendKeys(CString msg);

void SendAscii(wchar_t data, BOOL shift)
{
Вход вход[2];
memset(input, 0, 2 * sizeof(INPUT));

если (сдвиг) {
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_SHIFT;
SendInput(1, input, sizeof(INPUT));
}

input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = данные;

input[1].type = INPUT_KEYBOARD;
вход[1].ки.wVk = данные;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(2, input, sizeof(INPUT));

если (сдвиг) {
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_SHIFT;
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, input, sizeof(INPUT));
}
}


void SendUnicode(данные wchar_t)
{
Вход вход[2];
memset(input, 0, 2 * sizeof(INPUT));

input[0].type = INPUT_KEYBOARD;
вход[0].ki.wVk = 0;
input[0].ki.wScan = данные;
input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE;

input[1].type = INPUT_KEYBOARD;
вход[1].ki.wVk = 0;
input[1].ki.wScan = данные;
input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE;

SendInput(2, input, sizeof(INPUT));
}

void SendString(CString msg)
{
короткий ВК;
Смена типа bool ;

USES_CONVERSION;
wchar_t* data = T2W(msg.GetBuffer(0));
int len = wcslen(данные);

for(int i=0;i<len;i++)
{
если (данные[я] и gt;=0 &&усилителя; данные[я]&ЛТ;256)
{ //ascii-символ
vk = VkKeyScanW(data[i]);

if (vk == -1) SendUnicode(data[i]);
еще
{
если (vk < 0) vk = ~vk + 0x1;

shift = vk >> 8 & 0x1;

if (GetKeyState(VK_CAPITAL) & 0x1) {
если (данные[я]> У='А' &&усилителя; данные[я] и л;='з' | | - данные[я]> У='А' &&усилителя; данные[я] и л;='з')
{
сдвиг = !сдвиг;
}
}

SendAscii(vk & 0xFF, shift);
Сон(100);
}
}
else //unicode
{
SendUnicode(data[i]);
Сон(100);
}
}
}

Рейтинг:
0

Richard MacCutchan

WM_CHAR должен обрабатывать Unicode, как описано в разделе Сообщение WM_CHAR (Windows)[^]. Однако принимающее приложение должно быть разработано таким образом, чтобы ожидать появления символа Юникода.


Yount_0701

вы имеете в виду переписать Блокнот wndproc работы с сообщением WM_CHAR?

Richard MacCutchan

Я не думаю, что Microsoft выпустит исходный код.

Richard MacCutchan

Может быть, попробуем Сообщение WM_UNICHAR (Windows)[^].