разобрался сам, текст был в Unicode и его надо было сконвертировать. Сбился тем, что для определения формата буфера обмена вызывал GetPriorityClipboardFormat, который выдавал любой первый текстовый формат, указанный в параметре. Кто ж мог подумать, что если текст в ,буфере в CF_UNICODETEXT, GetPriorityClipboardFormat могу выдать CF_TEXT.
» C++ WinAPI
Оффтопик
Всем привет!
Проверяю отклик окна
Код: 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 );
}
Проверяю отклик окна
Код: 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 );
}
V0lt
По идее, может. Цикл обработки сообщений останавливается при извлечении из очереди сообщения WM_QUIT. Сообщения, попавшие в очередь до того должны быть обработаны. Если сообщение встало в очередь до вызова PostQuitMessage, оно должно быть обработано.
По идее, может. Цикл обработки сообщений останавливается при извлечении из очереди сообщения WM_QUIT. Сообщения, попавшие в очередь до того должны быть обработаны. Если сообщение встало в очередь до вызова PostQuitMessage, оно должно быть обработано.
Abs62
А реально как нибудь определить, что окно начало процесс закрытия (запустился OnClose())?
Мне пока приходят в голову два костыля... варианта:
1. В OnClose() менять заголовок окна, потом другой процесс его анализирует.
2. Посылать два WM_NULL с некоторым интервалом, потом гадаем над результатом.
Может есть более правильные способы?
А реально как нибудь определить, что окно начало процесс закрытия (запустился OnClose())?
Мне пока приходят в голову два костыля... варианта:
1. В OnClose() менять заголовок окна, потом другой процесс его анализирует.
2. Посылать два WM_NULL с некоторым интервалом, потом гадаем над результатом.
Может есть более правильные способы?
V0lt
Почитай девятую главу Рихтера о синхронизации потоков. Думаю, там можно подобрать метод посимпатичнее. Например, создать эвент, взводить его при готовности окна к употреблению и сбрасывать в начале закрытия. А в другом процессе проверять его состояние через WaitForSingleObject.
Почитай девятую главу Рихтера о синхронизации потоков. Думаю, там можно подобрать метод посимпатичнее. Например, создать эвент, взводить его при готовности окна к употреблению и сбрасывать в начале закрытия. А в другом процессе проверять его состояние через WaitForSingleObject.
Abs62
Че-то у меня сомнения по поводу WaitForSingleObject. Как я узнаю HANDLE эвента?
Изначально задача такая. Запущен первый экземпляр программы, он работает. Запускаем второй. Он ищет первый экземпляр. Если находит первого и тот не закрывается в текущий момент, тогда передает ему комстроку. Иначе выжидает немного и запускается сам.
Че-то у меня сомнения по поводу WaitForSingleObject. Как я узнаю HANDLE эвента?
Изначально задача такая. Запущен первый экземпляр программы, он работает. Запускаем второй. Он ищет первый экземпляр. Если находит первого и тот не закрывается в текущий момент, тогда передает ему комстроку. Иначе выжидает немного и запускается сам.
V0lt
Цитата:
Через OpenEvent, вестимо. Конечно, эвент должен быть именованным, с уникальным именем.
Цитата:
Как я узнаю HANDLE эвента?
Через OpenEvent, вестимо. Конечно, эвент должен быть именованным, с уникальным именем.
Abs62
Спасибо, буду разбираться.
Спасибо, буду разбираться.
1) OnClose:
GlobalAddAtom
...
GlobalDeleteAtom
2) если FindWindow то GlobalFindAtom
GlobalAddAtom
...
GlobalDeleteAtom
2) если FindWindow то GlobalFindAtom
kok80
Спасибо, посмотрю.
Задача. Есть CEdit. Нужно введенный символ запятой менять на точку. Есть функция OnChar(UINT nChar, UINT nRepCnt, UINT nFlags), но правка nChar и nFlags ни на что не влияет.
Как правильно такое сделать?
Спасибо, посмотрю.
Задача. Есть CEdit. Нужно введенный символ запятой менять на точку. Есть функция OnChar(UINT nChar, UINT nRepCnt, UINT nFlags), но правка nChar и nFlags ни на что не влияет.
Как правильно такое сделать?
а где winapi ? А нельзя ли просто потом при получении строки из edit менять зпт на тчк ?
EN_CHANGE : заменить все зпт на тчк
EN_CHANGE : заменить все зпт на тчк
kok80
Цитата:
такое решение есть, но не айс
Цитата:
как и где его использовать?
Цитата:
А нельзя ли просто потом при получении строки из edit менять зпт на тчк ?
такое решение есть, но не айс
Цитата:
EN_CHANGE : заменить все зпт на тчк
как и где его использовать?
V0lt Делай свой класс, наследуемый от CEdit, перехватывай в нем событие отпускания клавиши, и в случае получения кода запятой меняй его на точку.
а если copy-paste ? Фиг он тогда словит отпускание
vlary
Цитата:
Делал. Толку ноль. У тебя есть рабочий вариант?
kok80
Цитата:
Это тоже важно. Но для начала хочется научится подменять нажатие кнопок.
Цитата:
Делай свой класс, наследуемый от CEdit, перехватывай в нем событие отпускания клавиши, и в случае получения кода запятой меняй его на точку.
Делал. Толку ноль. У тебя есть рабочий вариант?
kok80
Цитата:
а если copy-paste ?
Это тоже важно. Но для начала хочется научится подменять нажатие кнопок.
V0lt
1.
Цитата:
Подойдет?
2.
Можно как kok80 сказал EN_CHANGE перехватывать, только оно прилетает паренту уже апостериори, т.е. придется GetWindowText меняем, что необходимо и SetWindowText новое значение.
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 новое значение.
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);
}
Цитата:
Подойдет?
есть такой код
Код: 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);
}
V0lt
Цитата:
А зачем?
Цитата:
GetLocaleInfo(...,LOCALE_SDECIMAL,...)
Цитата:
nFlags += 1;
А зачем?
Цитата:
Подскажите как узнать текущий символ для "разделителя целой и дробной части"?
GetLocaleInfo(...,LOCALE_SDECIMAL,...)
Abs62
Цитата:
Пытался сделать все параметры (nChar, nRepCnt и nFlags) как если бы была нажата точка. Эксперименты показали, что nFlags для запятой меньше точки ровно на единицу. Я конечно понимаю, что это не совсем правильно, но так я хоть точно понял, что OnChar бесполезен для подмены символов.
Цитата:
А зачем?
Пытался сделать все параметры (nChar, nRepCnt и nFlags) как если бы была нажата точка. Эксперименты показали, что nFlags для запятой меньше точки ровно на единицу. Я конечно понимаю, что это не совсем правильно, но так я хоть точно понял, что OnChar бесполезен для подмены символов.
Привет!
Как узнать время запуска процесса?
Как узнать время запуска процесса?
V0lt
Погляди функцию GetProcessTimes.
Погляди функцию GetProcessTimes.
V0lt
Микрософт советует так:
Код:
afx_msg void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == '.' || nChar == ',')
nChar = '.';
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
}
Микрософт советует так:
Код:
afx_msg void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == '.' || nChar == ',')
nChar = '.';
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
}
Abs62
Цитата:
Т.е. сначала EnumProcesses, ищу в массиве нужный процесс (EnumProcessModules+GetModuleBaseName), затем OpenProcess и только потом GetProcessTimes. Правильно, ничего лишнего?
Еще вопрос. Возможно ли такое, что FindWindow ничего не находит, потому что процесс еще не успел создать окно?
Sota
Работает! Спасибо!
Цитата:
Погляди функцию GetProcessTimes.
Т.е. сначала EnumProcesses, ищу в массиве нужный процесс (EnumProcessModules+GetModuleBaseName), затем OpenProcess и только потом GetProcessTimes. Правильно, ничего лишнего?
Еще вопрос. Возможно ли такое, что FindWindow ничего не находит, потому что процесс еще не успел создать окно?
Sota
Работает! Спасибо!
V0lt
Цитата:
Дык, программисту виднее, как нужный процесс искать.
Цитата:
Нет окна - нет и результата, вестимо.
Цитата:
Правильно, ничего лишнего?
Дык, программисту виднее, как нужный процесс искать.
Цитата:
Возможно ли такое, что FindWindow ничего не находит, потому что процесс еще не успел создать окно?
Нет окна - нет и результата, вестимо.
Здравствуйте, такой вопрос: у меня есть строка, нужно ее нарисовать на моем окне что бы все слова были разным цветом. В голову приходит только выводить каждое слово отдельным TextOut и перед каждым текстоутом устанавлить SetTextColor, однако такой вариант мне не подходит, уверен есть возможности получше.
Abs62
Цитата:
Я надеялся, что есть более простой способ А то четыре функции и цикл, имхо перебор.
Цитата:
Дык, программисту виднее, как нужный процесс искать.
Я надеялся, что есть более простой способ А то четыре функции и цикл, имхо перебор.
V0lt
Ну, если есть хэндл принадлежащего процессу окна, можно и чуток попроще - через GetWindowThreadProcessId.
Ну, если есть хэндл принадлежащего процессу окна, можно и чуток попроще - через GetWindowThreadProcessId.
Abs62
Спасибо.
В общем есть задача. Открываем в проводнике папку с 10 файлами, выделяем их, ПКМ, открыть. Винда запускает 10 процессов, а надо только 1 процесс, в котором будет открыто 10 файлов. Решение точно существует, только где бы его посмотреть.
Добавлено:
Еще. Есть функции CreateMutex и OpenMutex. Не могу понять смысл параметров bInitialOwner и bInheritHandle. Помогите разобраться.
Спасибо.
В общем есть задача. Открываем в проводнике папку с 10 файлами, выделяем их, ПКМ, открыть. Винда запускает 10 процессов, а надо только 1 процесс, в котором будет открыто 10 файлов. Решение точно существует, только где бы его посмотреть.
Добавлено:
Еще. Есть функции CreateMutex и OpenMutex. Не могу понять смысл параметров bInitialOwner и bInheritHandle. Помогите разобраться.
V0lt
bInitialOwner если True, то мутекс захватывается создавшим его потоком сразу после создания. До тех пор пока не будет вызван ReleaseMutex.
bInheritHandle стандартный апишный флаг, разрешающий наследовать хендлы в дочерних процессах.
bInitialOwner если True, то мутекс захватывается создавшим его потоком сразу после создания. До тех пор пока не будет вызван ReleaseMutex.
bInheritHandle стандартный апишный флаг, разрешающий наследовать хендлы в дочерних процессах.
Страницы: 12345678910111213141516171819202122232425262728293031323334353637
Предыдущая тема: посоветуйте книги по SQL
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.