Forums.Avtograd.Ru: Вопросы по WinApi - Forums.Avtograd.Ru

Перейти к содержимому

  • (4 Страниц)
  • +
  • 1
  • 2
  • 3
  • 4
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Вопросы по WinApi

#1 Пользователь офлайн   Exception

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 550
  • Регистрация: 01 Ноябрь 07

Отправлено 01 Ноябрь 2007 - 18:29

Если модератор не против, то вот примеры для Delphi для WinApi. :lol:
0


  • (4 Страниц)
  • +
  • 1
  • 2
  • 3
  • 4
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Другие ответы в этой теме

#21 Пользователь офлайн   Barrabas

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 431
  • Регистрация: 01 Ноябрь 07

Отправлено 30 Январь 2008 - 13:50

Просмотр сообщенияDr.V1.3 (28.1.2008, 14:34):

Для чего нужно запускать смд и писать в нем из программы дир?

шутка?
0

#22 Пользователь офлайн   JayTee2

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 01 Ноябрь 07

Отправлено 08 Март 2008 - 20:19

хдраствуйте программисты срочно нужна помощь!!! я делаю програмку которая читает порт и его нужно читать почти в реальном времену ну вообщем очень быстро как это можно реализовать? знаю что нужно исп таймер слышал про QueryPerformanceCounter и SetTimer() но у последнего похоже нельзя указывать интервал меньше 1мс а нужно меньше! пожлуйста хелп!!!! на СИ или VB
заранее спасибо!!!
оч надо
0

#23 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 08 Март 2008 - 20:59

Ну так через QueryPerformanceCounter это вроде и можно сделать с точностью кажись 15 мс, когда через SetTimer наверное максимальной точности можно добиться со значением 5 (1000 примерно 1 секунда). Тем более что через SetTimer Windows не предоставляет сверхбыстрый отсчет. Тут нужно чурез "ядро" лезть.
0

#24 Пользователь офлайн   TRUTHFUL

  • Пользователь
  • PipPip
  • Группа: Модераторы
  • Сообщений: 412
  • Регистрация: 01 Ноябрь 07

Отправлено 08 Март 2008 - 20:59

Просмотр сообщенияJayTee2 (8.3.2008, 20:19):

хдраствуйте программисты срочно нужна помощь!!! я делаю програмку которая читает порт и его нужно читать почти в реальном времену ну вообщем очень быстро как это можно реализовать? знаю что нужно исп таймер слышал про QueryPerformanceCounter и SetTimer() но у последнего похоже нельзя указывать интервал меньше 1мс а нужно меньше! пожлуйста хелп!!!! на СИ или VB
заранее спасибо!!!
оч надо

Какой интересно порт ты читаешь более 1000 раз в секунду? :)
Истина где-то рядом... Пускай там и остается!
0

#25 Пользователь офлайн   JayTee2

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 01 Ноябрь 07

Отправлено 10 Март 2008 - 13:27

в данный момент разобрался и решил читать порт LPT без таймера а напрямую циклом ...
ещё для того чтобы там кое сто считать мне всё же нужен таймер точностью до миллисекунд пробовал settimer он глючит стандартный тоже не пробовал QueryPerfomanse или как там напишите пожалуйста как его объявлять и пользоваться примерсик маленький заранее спасибо
но есть 2 идея считать в цикле а там идёт k=k+1 при заданных условиях миллисекундами системного времени так как с секундами всё прекрасно работает но с данными условиями нужны миллисекунды, узнал про GetLocalTime() но не понял как объявлять и ваще как работает, мне нужно например чтобы в переменную занасилось текущее значение миллисекунд системного времени писал s=GetLocaltime(millisecond) - не прёт объясните поалуйста!
нужно срочно!!
работаю в Visual Basic 6.0
0

#26 Пользователь офлайн   Terror

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 512
  • Регистрация: 01 Ноябрь 07

Отправлено 10 Март 2008 - 18:44

Если нужно читать постоянно то ничего лучше бесконечного цикла не придумаешь. Если нужна задержка по времени между операциями чтения попробуй использовать Sleep для усыпления читающего потока. Sleep(время в миллисекундах).

Не знаю какая у тебя задача, но все же предложу - использовать порт в режиме Overlapped. У меня есть готовый класс на С++ для работы с портом (использовался в программе для снятия данных с контроллера двигателя :)), но я так понимаю тебе он не поможет.

Вот кусок кода


while(TRUE)
{
dwEvtMask = 0 ;

WaitCommEvent(m_hCommPort, &dwEvtMask, NULL);

if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
// Тут чтение и вызов обработчика
}
else if((dwEvtMask & EV_TXEMPTY) == EV_TXEMPTY)
{
Log("Buffer is empty...");
}
}

WaitCommEvent усыпляет читающий поток до тех пор, пока с комом не произойдет что-либо (чтение, запись, очистка и т.д., зависит от флагов)
<!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->< a href="http://forums.avtograd.ru/index.php?showtopic=119165" target="_blank">Quick Confign - программа для быстрого изменения настроек Windows</a><!--sizec--></span><!--/sizec-->
0

#27 Пользователь офлайн   Terror

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 512
  • Регистрация: 01 Ноябрь 07

Отправлено 14 Март 2008 - 15:59

Есть программа, а именно часы для рабочего стола. Есть желание выводить их поверх logon screen. Как выводить знаю, но вот как определить момент, когда пользователь блокирует рабочую станцию - не соображу.

Поиск в гугле результатов не принес. Можеб быть кто-нибудь уже сталкивался с подобной задачей? Или натыкался на пример?
<!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->< a href="http://forums.avtograd.ru/index.php?showtopic=119165" target="_blank">Quick Confign - программа для быстрого изменения настроек Windows</a><!--sizec--></span><!--/sizec-->
0

#28 Пользователь офлайн   Terror

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 512
  • Регистрация: 01 Ноябрь 07

Отправлено 14 Март 2008 - 17:25

Если кому интересно: нужно ловить сообщение WM_WTSSESSION_CHANGE, wParam при блокировке станции будет равняться WTS_SESSION_LOCK, при разблокировке WTS_SESSION_UNLOCK.

Подробнее о всех значения можно почитать в MSDN
http://msdn2.microso...828(VS.85).aspx

Чтобы окно начало получать это сообщение необходимо вызвать:

WTSRegisterSessionNotification(m_hWnd, NOTIFY_FOR_THIS_SESSION);

Чтобы остановить получение уведомлений об изменениях сессии:

WTSUnRegisterSessionNotification(m_hWnd);
<!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->< a href="http://forums.avtograd.ru/index.php?showtopic=119165" target="_blank">Quick Confign - программа для быстрого изменения настроек Windows</a><!--sizec--></span><!--/sizec-->
0

#29 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 29 Март 2008 - 21:05

Скажите пожалуйста, а контрол SysLink работает начиная с системы Windows XP?
Если да, то что например будет в системе Винда98? Диалог просто не появится без регистрации его? Или как?
0

#30 Пользователь офлайн   Exception

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 550
  • Регистрация: 01 Ноябрь 07

Отправлено 07 Апрель 2008 - 20:22

Может у кого есть наработки для создания картинок+надпись в кнопка средствами ВинАпи на Делфи? А то за неимением вообще пришлось переделать немного глюкавый пример Ассарбада. Получилось круто, но когда тема оформления меняется на серебрянную в ИксПи, контрол вообще не перекрашивается... Есть ли у кого такие наработки? :)
0

#31 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 30 Апрель 2008 - 19:25

Кто-нибудь подскажет как все-таки сделать двойную буферизацию контрола? Вот мой код, но окно мерцает очень сильно. Что я не так сделал?
var 
  hdcWnd, hdcMem : HDC; 
  hbmMem, hbmOld : HBITMAP; 
  PS : TPaintStruct;
  R3 : TRect;
=========
	WM_PAINT :
	  begin
		GetClientRect(GetDlgItem(hApp, ID_LISTPROC_CONTROL), R3);
		hdcWnd := BeginPaint(GetDlgItem(hApp, ID_LISTPROC_CONTROL), PS);
		hdcMem := CreateCompatibleDC(hdcWnd);
		hbmMem := CreateCompatibleBitmap(hdcWnd, R3.Right - R3.Left, R3.Bottom - R3.Top);
		hbmOld := SelectObject(hdcMem, hbmMem);
		BitBlt(hdcWnd, 0, 0, R3.Right - R3.Left, R3.Bottom - R3.Top, hdcMem, 0, 0, SRCCOPY);
		SelectObject(hdcMem, hbmOld);
		DeleteObject(hbmMem);
		DeleteDC(hdcMem);
		EndPaint(GetDlgItem(hApp, ID_LISTPROC_CONTROL), PS);
	  end;
	WM_ERASEBKGND : Result := FALSE;

0

#32 Пользователь офлайн   TRUTHFUL

  • Пользователь
  • PipPip
  • Группа: Модераторы
  • Сообщений: 412
  • Регистрация: 01 Ноябрь 07

Отправлено 30 Апрель 2008 - 22:23

А что ты рисуешь то? У тебя же в hdcMem ничего не нарисовано.
Кроме того на сколько помню BeginPaint должен вызываться для окна, вызвавшего WM_PAINT, так что не факт, что эта процедура верно обрабатывается для GetDlgItem(hApp, ID_LISTPROC_CONTROL).
Истина где-то рядом... Пускай там и остается!
0

#33 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 30 Апрель 2008 - 23:33

Разобрался. Код должен быть таким:

	WM_PAINT :
	  begin
		GetClientRect(hApp, R3);
		hdcWnd := BeginPaint(hApp, PS);
		hbmMem := CreateCompatibleBitmap(hdcWnd, R3.Right - R3.Left, R3.Bottom - R3.Top);
		hdcMem := CreateCompatibleDC(hdcWnd);
		hbmWnd := SelectObject(hdcMem, hbmMem);
		BitBlt(hbmWnd, 0, 0, R3.Right - R3.Left, R3.Bottom - R3.Top, hdcMem, 0, 0, SRCCOPY);
		SelectObject(hdcMem, hbmWnd);
		DeleteObject(hbmMem);
		DeleteDC(hdcMem);
		EndPaint(hApp, PS);
	  end;
	WM_ERASEBKGND : Result := TRUE;


Хотя походу без разницы какой хэндл на диалоге подсовывать для буферизации. Буферизуется сразу целое окно. Только при запуске приложения на ребаре артефакты мелкие. Ну и при изменении его размеров значки прыгают на нем... Посылаю SendMessage(hApp, WM_ERASEBKGND, Integer(FALSE), 0) при старте приложения и вроде как артефактов на ребаре меньше становится, но все равно какой-то осадок остался...
0

#34 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 11 Октябрь 2008 - 22:34

На днях с модератором одного форума программистов сделал окончательный пример прорисовки кнопок в заголовке окна со стилем toolwindow - полностью на WinApi и в Delphi (не нашлось NonVCL примера реализации на просторах интернета, поэтому пришлось поднапрячь извилины и написать код).
Скачать пример реализации
Если требуется использовать обычный диалог (в примере использовано окно со стилем WS_EX_TOOLWINDOW), то необходимо подизменить координаты рисуемой кнопки в коде и заменить стиль кнопки в функциях DrawThemeBackground и DrawFrameControl для рисования остальных кнопок.
:)
0

#35 Пользователь офлайн   TRUTHFUL

  • Пользователь
  • PipPip
  • Группа: Модераторы
  • Сообщений: 412
  • Регистрация: 01 Ноябрь 07

Отправлено 19 Октябрь 2008 - 14:21

Просмотр сообщенияExplorer (11.10.2008, 23:34):

На днях с модератором одного форума программистов сделал окончательный пример прорисовки кнопок в заголовке окна со стилем toolwindow - полностью на WinApi и в Delphi (не нашлось NonVCL примера реализации на просторах интернета, поэтому пришлось поднапрячь извилины и написать код).
Скачать пример реализации
Если требуется использовать обычный диалог (в примере использовано окно со стилем WS_EX_TOOLWINDOW), то необходимо подизменить координаты рисуемой кнопки в коде и заменить стиль кнопки в функциях DrawThemeBackground и DrawFrameControl для рисования остальных кнопок.
:)

B.R.: Кнопка работает и прорисовывается, но у нее размер неправильный. Она в два раза шире и в два раза уже чем надо.
Истина где-то рядом... Пускай там и остается!
0

#36 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 19 Октябрь 2008 - 21:41

Ну как сказать-то... Если использовать темы оформления стандартные и классическую, то кнопка рисуется корректно. Я не знаю как получать размеры кнопки закрытия чтобы по ней ориентироваться с координатами.
P.S. У Windows Media Player 10 кнопка изменения режима окна в заголовке криво рисуется и с ошибками кстати. Если ты можешь помочь с усовершенствованием данного примера, милости просим... :)
0

#37 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 01 Ноябрь 2008 - 21:55

Нужен мне был контрол, совмещающий в себе ListBox и чекбоксы от ListView. В VCL есть ChecklListBox. ListView какой-то мудренный для толкового добавления строк по нужным индексам, а в листбоксе отсутствуют нужные чекбоксы. Вот для этого делал и состряпал на WinApi этот контрол.
Скачать пример

В примере демонстрируется следующее:
- Установка и снятие галочки в чекбоксе одного или всех пунктов
- Получение информации о состоянии выделенности чекбокса в пункте
- Отображение строк всех выделенных пунктов списка в сообщении
- Работа с кодировкой Юникод для загрузки и отображения строк
- Самостоятельная прорисовка строк в списке с некоторыми особенностями

:)

P.S. Есть некоторые глюки, но на исправление не хватает опыта в программировании и свободного времени.
0

#38 Пользователь офлайн   Saray

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 388
  • Регистрация: 31 Январь 08

Отправлено 04 Февраль 2009 - 08:33

Доброго времени суток уважаемые Гуру.
Нажимаю alt-F1 в заданном окне, предварительно сделав его активным:
BringWindowToTop( wnd );
keybd_event(VK_MENU,0,0,0);Sleep(0);
keybd_event(VK_F1,0,0,0);Sleep(0);
keybd_event(VK_F1,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);

Хочу сделать тоже самое, но не активизируя его
пробовал через SendMessage, PostMessage сообщениями WM_CHAR, WM_KEYDOWN, WM_SYSKEYDOWN - не получается...
Кроме того, скопировать картинку из свернутого окна
  DC := GetWindowDC(wnd);
  BitBlt( img.Canvas.Handle, 0, 0, img.Width, img.Height, DC,  x1, y1, SRCCOPY);

тоже не получается.
Подскажите в чем фишка ? :unsure:
Если женщина не права, нужно извиниться и замолчать.
0

#39 Пользователь офлайн   musashi

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 573
  • Регистрация: 01 Ноябрь 07

Отправлено 04 Февраль 2009 - 17:01

Saray
а приведи пример SendMessage, PostMessage - может там накосячил :)
0

#40 Пользователь офлайн   Saray

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 388
  • Регистрация: 31 Январь 08

Отправлено 05 Февраль 2009 - 12:16

Просмотр сообщенияmusashi (4.2.2009, 17:01):

Saray
а приведи пример SendMessage, PostMessage - может там накосячил :)

кое что заработало после перезагрузки виндовоза:
wnd := FindWindow(nil,'Безымянный - Блокнот');
PostMessage(wnd, WM_KEYDOWN, 112, 0); // давит F1 в блокноте

но.. свернутое окно по прежнему сообщений не получает :unsure:
(зато получает спрятанное :rolleyes: )
Если женщина не права, нужно извиниться и замолчать.
0

  • (4 Страниц)
  • +
  • 1
  • 2
  • 3
  • 4
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей