Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Юникод, имитация нажатия клавиш, Не могу решить 2 проблемы 
:(
    Опции темы
KTatsu
Дата 12.11.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 23.8.2008
Где: Москва

Репутация: 1
Всего: 1



Доброго времени суток, уважаемые Программисты.

Прошу помощи и совета в решении двух основных проблемм, с которыми я столкнулся.
Я знаю, что подобные темы были, но ясных ответов на вопросы не было, потому осмелюсь повторить вопросы в удобной для меня форме.

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

Вопрос, что нужно сделать, чтобы моя программа работала с Юникодом? А требуется открывать текст, соответственно в TRichEdit.
**Пока, что для работы приходится копировать текст через блокнот, но тут кириллица превращается в знаки вопроса.

2. Есть некая другая программа, от которой требуется програмное нажатие клавиш. Здесь я нашел пример:
Код

INPUT inp[2]; 
memset(inp,0,sizeof(inp)); 

inp[0].type=INPUT_KEYBOARD; 
inp[0].ki.wVk=0xBB; //тут код клавиши
inp[0].ki.dwFlags=0;

inp[1].type=INPUT_KEYBOARD; 
inp[1].ki.wVk=0xBB; //тут код клавиши
inp[1].ki.dwFlags=0; 

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

Но тут указанная клавиша печатается дважды, я изменил так:
Код

INPUT inp[1]; 
memset(inp,0,sizeof(inp)); 

inp[0].type=INPUT_KEYBOARD; 
inp[0].ki.wVk=0xBB; //тут код клавиши
inp[0].ki.dwFlags=0;

SendInput(1,inp,sizeof(INPUT));

Вроде все нормально, но, что мне делать, если мне нужно нажать одновременно Shift и какую-либо клавишу? Когда я вписываю Shift(VK_LSHIFT), получается, что он нажимается, но не отпускается(даже если пишу только для него). Подскажите пожалуйста, где есть нажатие, а где отпускание. С мышкой попроще было smile 
PM MAIL   Вверх
KTatsu
Дата 18.11.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 23.8.2008
Где: Москва

Репутация: 1
Всего: 1



Ну что, никто не может помочь чтоли? :(
PM MAIL   Вверх
ne0
Дата 20.11.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.6.2007

Репутация: нет
Всего: нет



Цитата(KTatsu @  12.11.2008,  21:02 Найти цитируемый пост)
Но тут указанная клавиша печатается дважды, я изменил

Выдержка из MSDN:
Цитата

.... skip ....
dwFlags
    Specifies various aspects of a keystroke. This member can be certain combinations of the following values.
.... skip ....
    KEYEVENTF_KEYUP
        If specified, the key is being released. If not specified, the key is being pressed.

.... skip ....

Т.е. надо было не убирать второй элемент массива, а просто заменить в нем:
Код

inp[1].ki.dwFlags=KEYEVENTF_KEYUP;

PM   Вверх
KTatsu
Дата 25.11.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 23.8.2008
Где: Москва

Репутация: 1
Всего: 1



Большое спасибо, помогло smile 
Теперь вопрос, чтобы например таким образом напечатать заглавную T(в английской раскладке), написал так:
Код

INPUT inp[4];
memset(inp,0,sizeof(inp));

inp[0].type=INPUT_KEYBOARD;
inp[0].ki.wVk=0x10;
inp[0].ki.dwFlags=0;

inp[1].type=INPUT_KEYBOARD;
inp[1].ki.wVk=0x54;
inp[1].ki.dwFlags=0;

inp[2].type=INPUT_KEYBOARD;
inp[2].ki.wVk=0x54;
inp[2].ki.dwFlags=KEYEVENTF_KEYUP;

inp[3].type=INPUT_KEYBOARD;
inp[3].ki.wVk=0x10;
inp[3].ki.dwFlags=KEYEVENTF_KEYUP;

SendInput(4,inp,sizeof(INPUT));

Оно работает, но правильно ли это?

И все также остался вопрос по поводу Юникода.
PM MAIL   Вверх
Dmi3ev
Дата 25.11.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



ну, как вариант, могу педложить:
Код

#include "utilcls.h"
//...
//что-то там
//...
wchar_t* a="твой юникод";
AnsiString b=WideToAnsi(a);


Это сообщение отредактировал(а) Dmi3ev - 25.11.2008, 01:04


--------------------

PM MAIL   Вверх
KTatsu
Дата 25.11.2008, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 23.8.2008
Где: Москва

Репутация: 1
Всего: 1



Цитата

ну, как вариант, могу педложить:
Код

#include "utilcls.h"
//...
//что-то там
//...
wchar_t* a="твой юникод";
AnsiString b=WideToAnsi(a);


Благодарю, но как мне открыть текстовый файл в "а"? На знаки "->" и "." билдер ругается.
PM MAIL   Вверх
ne0
Дата 28.11.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.6.2007

Репутация: нет
Всего: нет



KTatsu, попробуй это. Кроме всего прочего там есть Unicode версия списка строк TWideStringList. С ним загрузка файла будет выглядеть примерно так:
Код

TWideStringList *wsl = new TWideStringList();
// ...
wsl->LoadFromFile("FileName.txt");

for( int i = 0; i < wsl.Count; i ++ )
{
   DoSomethingProcW((*wsl)[i]);
}
// ...
delete wsl;


Добавлено @ 14:54
Ели нужно получить все содержимое файла в виде одной строки (включая переводы строки и возвраты каретки), то можно использовать код:
Код

WideString ws;
// wsl - это объект типа TWideStringList из предыдущего примера
ws = wsl->Text;


Это сообщение отредактировал(а) ne0 - 28.11.2008, 14:55
PM   Вверх
KTatsu
Дата 30.11.2008, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 23.8.2008
Где: Москва

Репутация: 1
Всего: 1



Простите за дотошность, а что происходит в этих строках?
Цитата

for( int i = 0; i < wsl.Count; i ++ )
{
   DoSomethingProcW((*wsl)[i]);
}

PM MAIL   Вверх
ne0
Дата 1.12.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.6.2007

Репутация: нет
Всего: нет



KTatsu, в этих строках происходит перебор всех загруженных в список строк. Поскольку VCL классы в билдере всегда используются только через указатели, то обратиться напрямую к operator[] нельзя. Поэтому сначала выполняется разыменование (*wsl), а уже потом обращение по индексу [i].

PS. В условии цикла должно быть wsl->Count, а не wsl.Count... Моя ошибка.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0831 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.