Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: kok80
Дата сообщения: 05.10.2011 12:15
разобрался сам, текст был в Unicode и его надо было сконвертировать. Сбился тем, что для определения формата буфера обмена вызывал GetPriorityClipboardFormat, который выдавал любой первый текстовый формат, указанный в параметре. Кто ж мог подумать, что если текст в ,буфере в CF_UNICODETEXT, GetPriorityClipboardFormat могу выдать CF_TEXT.
Автор: safxandr
Дата сообщения: 06.10.2011 11:40
Оффтопик
Автор: V0lt
Дата сообщения: 09.10.2011 09:07
Всем привет!
Проверяю отклик окна

Код: HWND hWnd = ::FindWindow(MPC_WND_CLASS_NAME, NULL);
if (hWnd) {
    DWORD Result = 0;
    LRESULT Return = 0;
    Return = ::SendMessageTimeout(hWnd, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 5000, &Result );
}
Автор: Abs62
Дата сообщения: 09.10.2011 12:45
V0lt
По идее, может. Цикл обработки сообщений останавливается при извлечении из очереди сообщения WM_QUIT. Сообщения, попавшие в очередь до того должны быть обработаны. Если сообщение встало в очередь до вызова PostQuitMessage, оно должно быть обработано.
Автор: V0lt
Дата сообщения: 09.10.2011 15:44
Abs62
А реально как нибудь определить, что окно начало процесс закрытия (запустился OnClose())?

Мне пока приходят в голову два костыля... варианта:
1. В OnClose() менять заголовок окна, потом другой процесс его анализирует.
2. Посылать два WM_NULL с некоторым интервалом, потом гадаем над результатом.
Может есть более правильные способы?
Автор: Abs62
Дата сообщения: 09.10.2011 16:16
V0lt
Почитай девятую главу Рихтера о синхронизации потоков. Думаю, там можно подобрать метод посимпатичнее. Например, создать эвент, взводить его при готовности окна к употреблению и сбрасывать в начале закрытия. А в другом процессе проверять его состояние через WaitForSingleObject.
Автор: V0lt
Дата сообщения: 09.10.2011 17:25
Abs62
Че-то у меня сомнения по поводу WaitForSingleObject. Как я узнаю HANDLE эвента?

Изначально задача такая. Запущен первый экземпляр программы, он работает. Запускаем второй. Он ищет первый экземпляр. Если находит первого и тот не закрывается в текущий момент, тогда передает ему комстроку. Иначе выжидает немного и запускается сам.
Автор: Abs62
Дата сообщения: 09.10.2011 17:49
V0lt

Цитата:
Как я узнаю HANDLE эвента?

Через OpenEvent, вестимо. Конечно, эвент должен быть именованным, с уникальным именем.
Автор: V0lt
Дата сообщения: 09.10.2011 20:41
Abs62
Спасибо, буду разбираться.
Автор: kok80
Дата сообщения: 11.10.2011 21:23
1) OnClose:
GlobalAddAtom
...
GlobalDeleteAtom

2) если FindWindow то GlobalFindAtom

Автор: V0lt
Дата сообщения: 12.10.2011 16:39
kok80
Спасибо, посмотрю.

Задача. Есть CEdit. Нужно введенный символ запятой менять на точку. Есть функция OnChar(UINT nChar, UINT nRepCnt, UINT nFlags), но правка nChar и nFlags ни на что не влияет.
Как правильно такое сделать?
Автор: kok80
Дата сообщения: 12.10.2011 20:56
а где winapi ? А нельзя ли просто потом при получении строки из edit менять зпт на тчк ?
EN_CHANGE : заменить все зпт на тчк
Автор: V0lt
Дата сообщения: 13.10.2011 06:13
kok80

Цитата:
А нельзя ли просто потом при получении строки из edit менять зпт на тчк ?

такое решение есть, но не айс


Цитата:
EN_CHANGE : заменить все зпт на тчк

как и где его использовать?
Автор: vlary
Дата сообщения: 13.10.2011 11:05
V0lt Делай свой класс, наследуемый от CEdit, перехватывай в нем событие отпускания клавиши, и в случае получения кода запятой меняй его на точку.
Автор: kok80
Дата сообщения: 13.10.2011 12:16
а если copy-paste ? Фиг он тогда словит отпускание
Автор: V0lt
Дата сообщения: 13.10.2011 16:46
vlary

Цитата:
Делай свой класс, наследуемый от CEdit, перехватывай в нем событие отпускания клавиши, и в случае получения кода запятой меняй его на точку.

Делал. Толку ноль. У тебя есть рабочий вариант?

kok80

Цитата:
а если copy-paste ?

Это тоже важно. Но для начала хочется научится подменять нажатие кнопок.
Автор: wasilissk
Дата сообщения: 13.10.2011 18:20
V0lt
1.

Цитата:
WM_CHAR message contains the character code of the key that was pressed.
wParam
The character code of the key.
lParam
The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state
hттp://msdn.microsoft.com/en-us/library/windows/desktop/ms646276(v=vs.85).aspx

Подойдет?

2.
Можно как kok80 сказал EN_CHANGE перехватывать, только оно прилетает паренту уже апостериори, т.е. придется GetWindowText меняем, что необходимо и SetWindowText новое значение.


Автор: V0lt
Дата сообщения: 14.10.2011 18:24
wasilissk

Цитата:
Подойдет?

есть такой код

Код: BEGIN_MESSAGE_MAP(CFloatEdit, CEdit)
    ON_WM_CHAR()
END_MESSAGE_MAP()
void CFloatEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if (nChar == ',') {
        nChar = '.';
        nFlags += 1;
    }
    CEdit::OnChar(nChar, nRepCnt, nFlags);
}
Автор: Abs62
Дата сообщения: 14.10.2011 19:39
V0lt

Цитата:
nFlags += 1;

А зачем?

Цитата:
Подскажите как узнать текущий символ для "разделителя целой и дробной части"?

GetLocaleInfo(...,LOCALE_SDECIMAL,...)
Автор: V0lt
Дата сообщения: 14.10.2011 19:59
Abs62

Цитата:
А зачем?

Пытался сделать все параметры (nChar, nRepCnt и nFlags) как если бы была нажата точка. Эксперименты показали, что nFlags для запятой меньше точки ровно на единицу. Я конечно понимаю, что это не совсем правильно, но так я хоть точно понял, что OnChar бесполезен для подмены символов.
Автор: V0lt
Дата сообщения: 23.10.2011 12:59
Привет!
Как узнать время запуска процесса?
Автор: Abs62
Дата сообщения: 23.10.2011 13:13
V0lt
Погляди функцию GetProcessTimes.
Автор: Sota
Дата сообщения: 24.10.2011 14:16
V0lt
Микрософт советует так:

Код:
afx_msg void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == '.' || nChar == ',')
nChar = '.';
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
}
Автор: V0lt
Дата сообщения: 24.10.2011 18:52
Abs62

Цитата:
Погляди функцию GetProcessTimes.

Т.е. сначала EnumProcesses, ищу в массиве нужный процесс (EnumProcessModules+GetModuleBaseName), затем OpenProcess и только потом GetProcessTimes. Правильно, ничего лишнего?

Еще вопрос. Возможно ли такое, что FindWindow ничего не находит, потому что процесс еще не успел создать окно?

Sota
Работает! Спасибо!
Автор: Abs62
Дата сообщения: 24.10.2011 20:25
V0lt

Цитата:
Правильно, ничего лишнего?

Дык, программисту виднее, как нужный процесс искать.

Цитата:
Возможно ли такое, что FindWindow ничего не находит, потому что процесс еще не успел создать окно?

Нет окна - нет и результата, вестимо.
Автор: kentuki13
Дата сообщения: 24.10.2011 20:25
Здравствуйте, такой вопрос: у меня есть строка, нужно ее нарисовать на моем окне что бы все слова были разным цветом. В голову приходит только выводить каждое слово отдельным TextOut и перед каждым текстоутом устанавлить SetTextColor, однако такой вариант мне не подходит, уверен есть возможности получше.
Автор: V0lt
Дата сообщения: 24.10.2011 21:09
Abs62

Цитата:
Дык, программисту виднее, как нужный процесс искать.

Я надеялся, что есть более простой способ А то четыре функции и цикл, имхо перебор.
Автор: Abs62
Дата сообщения: 24.10.2011 21:59
V0lt
Ну, если есть хэндл принадлежащего процессу окна, можно и чуток попроще - через GetWindowThreadProcessId.
Автор: V0lt
Дата сообщения: 25.10.2011 05:56
Abs62
Спасибо.

В общем есть задача. Открываем в проводнике папку с 10 файлами, выделяем их, ПКМ, открыть. Винда запускает 10 процессов, а надо только 1 процесс, в котором будет открыто 10 файлов. Решение точно существует, только где бы его посмотреть.

Добавлено:
Еще. Есть функции CreateMutex и OpenMutex. Не могу понять смысл параметров bInitialOwner и bInheritHandle. Помогите разобраться.
Автор: wasilissk
Дата сообщения: 25.10.2011 06:49
V0lt
bInitialOwner если True, то мутекс захватывается создавшим его потоком сразу после создания. До тех пор пока не будет вызван ReleaseMutex.
bInheritHandle стандартный апишный флаг, разрешающий наследовать хендлы в дочерних процессах.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.