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

» C++ WinAPI

Автор: plazzmex
Дата сообщения: 19.05.2007 21:04
FireZone
спасибо
Автор: unreal666
Дата сообщения: 20.05.2007 11:20
Какие API (если это вообще через API) используются для доступа к дискам?
Как это делается в дисковых редакторах (WinHex и ему подобные). Или, если есть какой-нибудь дисковый редактор с открытыми исходниками, дайте на него ссылку.
Автор: dmka
Дата сообщения: 20.05.2007 11:58
unreal666
Думаю что используется DeviceIoControl для \\.\PhysicalDriveX
http://msdn2.microsoft.com/en-us/library/aa363216.aspx
Автор: plazzmex
Дата сообщения: 23.05.2007 16:40
у меня не работает функция GetKeyState
точнее я не знаю как сделать чтоб она работала.
я хочу кпримеру чтоб когда я нажимю на shift в программе отображалось какое либо сообщение...

спасибо заранее.
Автор: Abs62
Дата сообщения: 23.05.2007 18:13
plazzmex

Цитата:
у меня не работает функция GetKeyState

Что значит "не работает"?

Цитата:
я хочу кпримеру чтоб когда я нажимю на shift в программе отображалось какое либо сообщение...

Обрабатывай сообщение WM_KEYDOWN.
Автор: plazzmex
Дата сообщения: 23.05.2007 19:39
Abs62

Цитата:
Обрабатывай сообщение WM_KEYDOWN.

да.. но мне нужно чтоб допустим при нажатии шифта писалось что был нажат шифт
при нажатии пробела писалось что был нажат пробел
а насколько я знаю WM_KEYDOWN это общее для всех.. (может я ошибаюсь, я все еще новичок)

добавлено:
меня вдруг осенило что я могу сделать WM_KEYDOWN и под ним select case с wParam скодом каждой кнопки!
но есть другой вопрос:
как пользоватся функцией GetKeyState чтоб узнать к примеру состояние NumLock'a...?
Автор: Abs62
Дата сообщения: 23.05.2007 20:39
plazzmex

Цитата:
меня вдруг осенило что я могу сделать WM_KEYDOWN и под ним select case с wParam скодом каждой кнопки!

Вот именно.

Цитата:
как пользоватся функцией GetKeyState чтоб узнать к примеру состояние NumLock'a...?


Цитата:
The return value specifies the status of the specified virtual key, as follows:

- If the high-order bit is 1, the key is down; otherwise, it is up.
- If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
(С) MSDN.
Так что просто проверяешь младший бит возвращаемого значения.
if(GetKeyState(VK_NUMLOCK) & 1) //NumLock включён
else // NumLock выключен
Автор: plazzmex
Дата сообщения: 24.05.2007 01:00
Abs62
огромное спасибо!!!
но есть еще проблема. как определить левый или правый шифт. на MSDN написано что нужно GetKeyState для этого.
вот как я попытался.. но это не рабоет :

Код:
case WM_KEYDOWN:
{
switch (LOWORD(wParam))
{
case VK_SHIFT:
if(GetKeyState(VK_LSHIFT) & 1)
{
strcpy(_KeyName,"Left Shift");
InvalidateRect(hwnd,NULL,TRUE);
return 0;
}
else
{
strcpy(_KeyName,"Right Shift");
InvalidateRect(hwnd,NULL,TRUE);
return 0;
}
Автор: BugFixer
Дата сообщения: 24.05.2007 06:16
plazzmex

Цитата:
и вообще что означает значок "&" в if?

Про bitset почитай. Крайне полезно...
Что возвратит GetKeyState(VK_LSHIFT)? Некий набор нулей и единиц. Неважно, какого типа. (В данном случае - SHORT)

А для того, чтобы выяснить, что в бите с номером х - 0 или 1 делаем маску, в которой в бит с номером х ставим единицу, пересекаем с исследуемым значением и смотрим на результат.

В случае if нам интересно лишь то, 0 там или что нибудь ещё.
Конструкция if (a) есть сокращённая запись от if (a != 0)
Таким образом if (a & b) - это проверка, что (a & b) != 0, т.е. у a и b совпадает хоть один бит
Автор: Abs62
Дата сообщения: 24.05.2007 08:32
plazzmex

Цитата:
но есть еще проблема. как определить левый или правый шифт. на MSDN написано что нужно GetKeyState для этого.

А можно и посмотреть на скан-код клавиши (он передаётся в LPARAM, биты 16-23). Скан-код левого Shift - 0x2A, правого - 0x36.

Код: unsigned scan_code=(lParam >> 16) & 0xFF;
if(scan_code==0x2A) // левый Shift
if(scan_code==0x36) // правый Shift
Автор: plazzmex
Дата сообщения: 24.05.2007 18:25
BugFixer
ок.. спасибо..
Abs62

Цитата:
А можно и посмотреть на скан-код клавиши (он передаётся в LPARAM, биты 16-23). Скан-код левого Shift - 0x2A, правого - 0x36.


Код: unsigned scan_code=(lParam >> 16) & 0xFF;
if(scan_code==0x2A) // левый Shift
if(scan_code==0x36) // правый Shift
Автор: TeXpert
Дата сообщения: 24.05.2007 18:43
plazzmex
Цитата:
...и что такое unsigned scan_code=(lParam >> 16).
Сдвиг вправо на 16 позиций.
Цитата:
...это на C++?
и на C тоже. Я бы писал так:
Код: case VK_SHIFT:
if(GetKeyState(VK_LSHIFT) & 1){
strcpy(_KeyName,"Left Shift");
} else {
strcpy(_KeyName,"Right Shift");
}
InvalidateRect(hwnd,NULL,TRUE);
return 0;
Автор: Abs62
Дата сообщения: 24.05.2007 21:33
plazzmex

Цитата:
а как я могу узнать scan code других клавиш?

Заглянуть сюда, например.
Только надо не забывать, что скан-коды обозначены как "device-dependent", так что использовать GetKeyState будет правильнее.

TeXpert

Цитата:
А почему не работает, надо смотреть.

Да потому, что младший бит - это состояние переключателя типа CapsLock/NumLock, а индикатор нажатия - это старший бит.
Так что не if(GetKeyState(VK_LSHIFT) & 1), а if(GetKeyState(VK_LSHIFT) & 0x8000).
Автор: TeXpert
Дата сообщения: 24.05.2007 21:39
Abs62 Да я не посмотрел туда). Ясно, что это элементарно, просто товарищ упорно не хочет в учебник заглядывать.
Автор: plazzmex
Дата сообщения: 25.05.2007 17:10
TeXpert
спасибо огромное !
Abs62

Цитата:
Только надо не забывать, что скан-коды обозначены как "device-dependent", так что использовать GetKeyState будет правильнее.

ок. спасибо

P.S
Alt не действует. его windows перехватывает что ли?
так же как и F10, PrintScreen...
когда делаю вот так то ничего не происходит:

Код:
case VK_MENU:
if(GetKeyState(VK_LMENU) & 0x8000)
{
strcpy(_KeyName,"Left Alt");
}
else
{
strcpy(_KeyName,"Right Alt");
}
InvalidateRect(hwnd,NULL,TRUE);
return 0;
Автор: Abs62
Дата сообщения: 26.05.2007 19:03
plazzmex

Цитата:
наверное пора купить

С этого надо было начинать.

Цитата:
Alt не действует. его windows перехватывает что ли?
так же как и F10, PrintScreen...
когда делаю вот так то ничего не происходит:

Конечно, не происходит. Alt и F10 - это системные клавиши, они генерируют не WM_KEYDOWN, а WM_SYSKEYDOWN.

Цитата:
The WM_SYSKEYDOWN message is posted to the window with the keyboard focus when the user presses the F10 key (which activates the menu bar) or holds down the ALT key and then presses another key. It also occurs when no window currently has the keyboard focus; in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that receives the message can distinguish between these two contexts by checking the context code in the lParam parameter.
(С) MSDN.
Что касается PrintScreen - эта клавиша вообще не генерирует WM_KEYDOWN. Лови её в WM_KEYUP.
Автор: plazzmex
Дата сообщения: 27.05.2007 18:08
а как можно сделать глобальные кеи? например как в винампе ?
которые моя программа будет перехватывать от других приложений ?
я попытался с WM_USER но ничего не вышло..

и еще один вопрос:
как проверить работает ли какая нибудь программа на fullscreen.
на пример моя програмаа работает WS_EX_TOPMOST..
так вот чтоб когда пользователь запускает какую нибудь игру или презентацию на fullscreen моя программа будет отменять TOPMOST.
Автор: MorisA
Дата сообщения: 27.05.2007 18:43
Здравствуйте!
Нужно создать какую нибудь заставку к программе, сама программа написана на MFC, т.е. когда запускаешь exe-к сначала проигрываеться какая-нибудь анимация, можно клип или flash-ку какую-нибудь встроить, а может проще будет просто с графикой поработать? Что мне лучше сначала изучить и что проще и быстрее будет в реализации?
Заранее благодарен за помощь.
Автор: Abs62
Дата сообщения: 27.05.2007 19:43
plazzmex

Цитата:
а как можно сделать глобальные кеи? например как в винампе ?

Хук ставить. Смотри функцию SetWindowsHookEx с WH_KEYBOARD (или WH_KEYBOARD_LL).
Автор: TeXpert
Дата сообщения: 27.05.2007 20:35
plazzmex
Цитата:
а как можно сделать глобальные кеи? например как в винампе ?
Глобальные нельзя, наксолько знаю. Надо ставить хук (ловушку) на клавиатуру.
Автор: plazzmex
Дата сообщения: 27.05.2007 21:38

Цитата:
Хук ставить. Смотри функцию SetWindowsHookEx с WH_KEYBOARD (или WH_KEYBOARD_LL).


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

там странно объясняется..

Код: lpfn
[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a DLL. Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
hMod
Автор: TeXpert
Дата сообщения: 27.05.2007 21:56
plazzmex
Цитата:
что то я не совсем понял
Возможно, тебе рановато пока?) Смотри книгу Рихтера, лучше предыдущие издания (у нас их выпущено 3).

Насчёт предыдущего -- это сложно делается, с твоими знаниями вряд ли сделаешь быстро, совет всё тот же -- основательно проштудировать Рихтера.
Автор: plazzmex
Дата сообщения: 27.05.2007 22:22
TeXpert

Цитата:
Возможно, тебе рановато пока?

возможно..

Цитата:
Смотри книгу Рихтера

а как именно называется книга?

Цитата:
Насчёт предыдущего -- это сложно делается, с твоими знаниями вряд ли сделаешь быстро, совет всё тот же -- основательно проштудировать Рихтера.

это насчет fullscreen'a ? а разве нет какой то функции которая проверяет fullscreen ? и я ставлю для нее таймер убирания TOPMOST либо сворачивания в трей..

p.s : тогда помогите еще с маленьким вопросом, пожалуйста.
как я делаю underline или bold вкакой то строчке в тексте окна DialogBox ?
и как я меняю в DialogBox фонт только какому то одному ID текста? потому что если я делаю к приеру FONT 8, "MS Sans Serif" то это меняет фонт всему тексту...
p.s2: как я меняю фонт текста в главном окне программы?
p.s3: я отобразил icon в Dialogbox но как я могу его растянуть ? при помощи задачи параметров Width и Height ничего не меняется!?

спасибо заранее..
Автор: Abs62
Дата сообщения: 27.05.2007 22:43
plazzmex

Цитата:
а как именно называется книга?

Jeffrey Richter "Programming Application for Microsoft Windows". Есть здесь.

Цитата:
как я делаю underline или bold вкакой то строчке в тексте окна DialogBox ?
и как я меняю в DialogBox фонт только какому то одному ID текста?

Ну откуда же мы знаем, как ты это делаешь.
Если интересует, как это сделать - создать соответствующий фонт и послать искомому окну сообщение WM_SETFONT с его хэндлом в WPARAM.

Цитата:
p.s2: как я меняю фонт текста в главном окне программы?

Создаёшь соответствующий фонт и выбираешь его в контекст дисплея перед выводом текста.

Цитата:
p.s3: я отобразил icon в Dialogbox но как я могу его растянуть ?

icon - это изображение фиксированного размера.
Автор: TeXpert
Дата сообщения: 27.05.2007 22:54
plazzmex
Цитата:
а как именно называется книга
Abs62 уже ответил. Если читаешь на аглицком, у меня есть его более ранняя книга Windows 95: A Developer's Guide" (Richter and Locke), там замечательно про все хуки написано, для начинающих в самый раз. Ну и MSDN.
Цитата:
это насчет fullscreen'a ? а разве нет какой то функции которая проверяет fullscreen ? и я ставлю для нее таймер убирания TOPMOST либо сворачивания в трей..
В Windows 9x это сделать было бы намного проще, а универсальное решение дорого обойдётся.
Цитата:
p.s : тогда помогите еще с маленьким вопросом, пожалуйста.
как я делаю underline или bold вкакой то строчке в тексте окна DialogBox ?
и как я меняю в DialogBox фонт только какому то одному ID текста? потому что если я делаю к приеру FONT 8, "MS Sans Serif" то это меняет фонт всему тексту...
p.s2: как я меняю фонт текста в главном окне программы?
p.s3: я отобразил icon в Dialogbox но как я могу его растянуть ? при помощи задачи параметров Width и Height ничего не меняется!?
Ответы на такого рода вопросы найдёшь в книге Петзолда "Программирование для Windows 9x", куча изданий было.

Автор: Garrett
Дата сообщения: 27.05.2007 22:55
plazzmex
По поводу PSов.
Берешь любую книгу по MFC(н-р, Круглински) и читаешь.
Можно готовые примеры взять в MSDN по MFC (SetFont)

PS. Вышеприведенная ссылка на книгу Рихтера приведёт на мой сайт. Т.ч. найдешь опечатки пиши в ПМ или на мейл, я исправлю.
Автор: plazzmex
Дата сообщения: 27.05.2007 23:06
Abs62

Цитата:
создать соответствующий фонт

в каком смысле создать?

Цитата:
icon - это изображение фиксированного размера.

но у меня файл .ico в котором куча разных разрешений... почему показывается только одно?
TeXpert

Цитата:
Ответы на такого рода вопросы найдёшь в книге Петзолда "Программирование для Windows 9x", куча изданий было.

ок, спасибо...
Garrett

Цитата:
По поводу PSов.
Берешь любую книгу по MFC(н-р, Круглински) и читаешь.
Можно готовые примеры взять в MSDN по MFC (SetFont)

Ок..
Автор: TeXpert
Дата сообщения: 27.05.2007 23:08
Garrett В данном случае ему MFC вреден определённо. Дай ему Петзолда. Кстати, у тебя нету случайно последнего "чистого" издания Круглинского (вроде это 5-е издание)? А то у америкосов дурная привычка присасываться к автору (земля ему пухом), причём ценность книги упала. Меня просто интересует краткий курс C++ в конце 5-го издания, желательно в текстовом виде.
Автор: Garrett
Дата сообщения: 28.05.2007 00:03
TeXpert
Петцольда залить нетрудно, будет ли товарищ читать?
Я думаю, что MFC облегчит ему работу.
Про Круглински. 5-ое издание было издано уже после смерти Круглински.
Тебе нужно 4-ое. У меня есть и книга и был диск от неё, но сейчас я его не нашел.
Постараюсь на днях поискать.
Автор: Abs62
Дата сообщения: 28.05.2007 00:13
plazzmex

Цитата:
в каком смысле создать?

В смысле CreateFont (или CreateFontIndirect).

Цитата:
но у меня файл .ico в котором куча разных разрешений... почему показывается только одно?

По определению.
Для загрузки иконки DialogBox использует функцию LoadIcon, а она грузит иконку только одного размера.

Цитата:
LoadIcon can only load an icon whose size conforms to the SM_CXICON and SM_CYICON system metric values.
(C) MSDN
Если очень хочется поразвлекаться с иконкой в диалоге, выставь ей стиль SS_OWNERDRAW и отрисовывай её самостоятельно в обработчике WM_DRAWITEM.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

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


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