Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Моментальности не надо. Все равно в ходе выполнения будет делаться куча проверок, а так как на "другом конце" висит микроконтроллер и общение происходит коммандами, то тем более с моментальностью проблем нет. Главное что бы время отклика не превышало время такта COM порта.
 
Abs62
А можно по подробней про IsDialogMessage? Что то я в МСДН ничего конкретного не увидел.

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 13:28 14-10-2009
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth
Дык, а что поподробнее? Стандартный цикл обработки сообщений для программы с немодальным диалогом выглядит примерно так:

Код:
while(GetMessage(&msg,NULL,0,0)) {
    if(hDlg==0 || !IsDialogMessage(hDlg,&msg)) {  //hDlg - хэндл немодального диалога
      TranslateMessage (&msg) ;
      DispatchMessage (&msg) ;
    }
  }

То бишь перед тем, как сообщение будет передано основному окну, оно отправляется на обработку в диалог, как раз чтобы нормально работал стандартный клавиатурный интерфейс диалога. И если оно там обработано (IsDialogMessage вернула TRUE), в обработчик основного окна оно уже не попадёт.
А процедура диалога, получив WM_KEYDOWN, либо отработает его сама (для стандартных комбинаций), либо отправит элементу, на котором стоит фокус ввода (кнопке, например). Там оно и сгинет, поскольку кнопке большинство этих сообщений не надобно.
Вот и получается, что для того, чтобы обрабатывать WM_KEYDOWN самостоятельно, ловить его надо в главном цикле обработки сообщений программы, до IsDialogMessage. Либо делать сабклассинг.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 17:30 14-10-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть "залипший" файл (т.е. файл, кот. не удаляется никакими способами)
в принципе задача решается всякими unlocker'ами, но у меня вопрос:
 
возможно ли это сделать самому средствами апи? как?

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 15:37 21-10-2009 | Исправлено: akaGM, 15:53 21-10-2009
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Глянь здесь.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 22:39 21-10-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
да...
на халяву не получится
спасибо за ссылку

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 14:05 22-10-2009
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задачка.
Допустим есть некий my.dll зарегистрированная командой Regsvr32 my.dll
Вопрос: Как сторонней утилите узнать, что данный файл действительно зарегистрирован в системе и если зарегистрирован, то как узнать путь к этому файлу?

Всего записей: 10507 | Зарегистр. 05-02-2003 | Отправлено: 06:52 20-01-2010
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Наверно, найти соответствующий GUID в HKEY_CLASSES_ROOT\CLSID и глянуть ключ InprocServer32.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:31 20-01-2010
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
Наверно, найти соответствующий GUID в HKEY_CLASSES_ROOT\CLSID и глянуть ключ InprocServer32

а я надеялся, что существует специальная функция

Всего записей: 10507 | Зарегистр. 05-02-2003 | Отправлено: 17:22 20-01-2010
kok80

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите, или может у кого какие мысли рождаются:
запускаю внешнюю прогу, вызываю диалог открытия файла, нахожу хэндл EDIT, пытаюсь в него занести нужный пусть с имменем файла (delphi, но суть надеюсь понятна):
 
repeat WINDOW:=FindWindow('#32770','Открыть изображение'); until WINDOW>0;
repeat window:=FindWindowEx(window,0,'Edit',nil); until WINDOW>0;
window = хэндл EDIT в диалоговом окне
 
SendMessage(WINDOW,WM_SETTEXT,0,dword(comment))
результат a=1, те сообщение отправлено
 
a:=SendMessage(WINDOW,wm_gettextlength,0,0);
результат = длина отправленной строки
 
SendMessage(WINDOW,wm_gettext,100,dword(bufer));
в итоге bufer содержит строку, которую отправлял
 
Но зрительно я этой строки не вижу в EDIT, из другой програмы пытаюсь получить длину строки и строку - результат нулевой, те строка пуста
ставлю задержку SLEEP(1000) после findwindowex  и перед wm_settext - все ок.
 
Вопросы -  
1) что делаю не так?
2) как узнать при создании окна в чужой проге, что окно готово к работе
(с другими внешними приложениями - наличие хэндла окна через FindWindow было достаточным условием  для манипуляций с окном, те есть хэндл - значит готово, а здесь ни фига)
3) чего этот гад врет, что EDIT содержит нужную строку нужной длины

Всего записей: 39 | Зарегистр. 04-10-2004 | Отправлено: 18:34 21-01-2010 | Исправлено: kok80, 18:39 21-01-2010
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kok80

Цитата:
1) что делаю не так?


Цитата:
repeat window:=FindWindowEx(window,0,'Edit',nil); until WINDOW>0;

Если FindWindowEx вернула NULL, всё пойдёт наперекосяк.

Цитата:
3) чего этот гад врет, что EDIT содержит нужную строку нужной длины

Кто сказал, что врёт? Если та программа сама выставляет содержимое окна уже после того, как отработали WM_SETTEXT и WM_GETTEXT, так оно и получится. А судя по "ставлю задержку SLEEP(1000) после findwindowex  и перед wm_settext - все ок" - так оно и есть.

Цитата:
2) как узнать при создании окна в чужой проге, что окно готово к работе

Ну, можно ещё попробовать подождать, пока оно будет показано. Через IsWindowVisible.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:13 21-01-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ИМХО траблы в том, что окно помимо того, что получило текст должно еще перерисоваться, чтобы текст отобразить.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:47 22-01-2010
kok80

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Цитата:repeat window:=FindWindowEx(window,0,'Edit',nil); until WINDOW>0;  
 
 
Если FindWindowEx вернула NULL, всё пойдёт наперекосяк.

 
не, код как раз и ищет окно до тех пор, пока переменная WINDOW станет больше 0. Прекрасно везде и всегда находит все создающиеся окна.
 
А мысль о том, что после создания прога может обнулять строку мне в голову не пришла, и действительно IsWindowVisible спас ситуацию:
 
вместо SLEEP(1000) поставил repeat until IsWindowVisible(WINDOW) и всё заработало. Спасибо.

Всего записей: 39 | Зарегистр. 04-10-2004 | Отправлено: 15:50 22-01-2010
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kok80

Цитата:
не, код как раз и ищет окно до тех пор, пока переменная WINDOW станет больше 0.

Всё бы хорошо, но эта же переменная и задаёт родительское окно, в котором идёт поиск. Так что как только FindWindowEx вернёт NULL, следующий поиск уже пойдёт на Desktop, а не в найденном ранее окне.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 17:06 22-01-2010
VadimLou



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
файл действительно зарегистрирован

ole32.dll -> if (Succeeded(StringFromCLSID(...

Всего записей: 702 | Зарегистр. 22-07-2004 | Отправлено: 05:45 28-01-2010
CruelCrow

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ли модифицировать ресурс в памяти?
Т.е. у меня, к примеру, есть зашифрованный файл dialog.html, который присоединяется ресурсом к проекту.
Этот файл содержит текст "<lmth><ydob>12345</ydob></lmht>", а я хочу, чтобы после запуска программы запускался "дешифратор" и любое последующие обращение к ресурсу (в данном случае - отображение диалогового окна html) возвращало "<html><body>23456</body></html>".
 
 
Добавлено:
Всё, разобрался.
 

Код:
 
//modify html resource
//
HRSRC   hRes;
HGLOBAL hResourceLoaded;
TCHAR *lpResLock = L" ";
DWORD   dwSizeRes;
 
hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_HTML_TEST_HTML_CIPHER_DIALOG), RT_HTML);
hResourceLoaded = LoadResource(NULL, hRes);
lpResLock = (TCHAR*) LockResource(hResourceLoaded);
dwSizeRes = SizeofResource(NULL, hRes);
 
int i;
for (i=0; i<=dwSizeRes-1; i++) lpResLock[i] = L'a';
//
 

Всего записей: 109 | Зарегистр. 21-05-2006 | Отправлено: 15:06 18-02-2010 | Исправлено: CruelCrow, 15:30 18-02-2010
koderr



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день.
Проблема, собственно: есть Gdiplus::Graphics, созданный на основе записывающегося Gdiplus::Metafile, в этот Graphics отрисовываются по DrawImage другие метафайлы, т.е. несколько изображений объединяются в одно. Если памяти не хватает, то в один прекрасный момент DrawImage возвращает Win32Error и в итоге в файл ничего не записывается. Можно ли как-то "спасти" то, что уже отрисовалось?

----------
The truth is out there...

Всего записей: 353 | Зарегистр. 22-06-2005 | Отправлено: 18:08 22-02-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем!
Пытаюсь разобраться с таким вопросом.
В Windows кнопки в заголовке окна (Minimize/Restore, Maximize, Close) в зависимости от темы могут иметь разный размер и по-разному располагаться на заголовке.  
Мне эти кнопки надо отрисовывать вручную вызовами DrawThemeBackground() и здесь нужны именно координаты прямоугольника.
 
У системы как-то можно узнать, в каком прямоугольнике должна рисоваться каждая кнопка?  
 
Меня, главным образом, интересует способ, не базирующийся на каких-то предварительных "экспериментальных" измерениях зазоров между кнопками и т.п.

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 18:17 02-03-2010
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
int WINAPI GetSystemMetrics(
  __in  int nIndex
);
SM_CXSIZE 30    - The width of a button in a window caption or title bar, in pixels.
SM_CYSIZE 31    - The height of a button in a window caption or title bar, in pixels.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 22:52 02-03-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
Это всё понятно, но задача же не ограничивается нахождением размеров кнопок.
Прямоугольник кнопки надо еще расположить там, где надо.
Я понимаю, что можно путем подгона отрисовать кнопки там, где их рисует система, но это не то, что хотелось бы получить.  
Собственно, для меня вопрос сводится к тому, как у системы именно расположение кнопок узнать.

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 01:55 03-03-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
Не узнаешь, сам бился с этой темой. Вернее мне не удалось.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:53 03-03-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru