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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
plazzmex
GetDeviceCaps или GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 17:32 19-05-2007
plazzmex



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

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 22:04 19-05-2007
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Какие API (если это вообще через API) используются для доступа к дискам?  
Как это делается в дисковых редакторах (WinHex и ему подобные). Или, если есть какой-нибудь дисковый редактор с открытыми исходниками, дайте на него ссылку.

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 12:20 20-05-2007
dmka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
unreal666
Думаю что используется DeviceIoControl для \\.\PhysicalDriveX
http://msdn2.microsoft.com/en-us/library/aa363216.aspx

Всего записей: 947 | Зарегистр. 23-04-2003 | Отправлено: 12:58 20-05-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у меня не работает функция GetKeyState
точнее я не знаю как сделать чтоб она работала.
я хочу кпримеру чтоб когда я нажимю на shift в программе отображалось какое либо сообщение...
 
спасибо заранее.

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 17:40 23-05-2007
Abs62



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

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

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

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

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

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:13 23-05-2007
plazzmex



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

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

да.. но мне нужно чтоб допустим при нажатии шифта писалось что был нажат шифт
при нажатии пробела писалось что был нажат пробел
а насколько я знаю WM_KEYDOWN это общее для всех.. (может я ошибаюсь, я все еще новичок)
 
добавлено:
меня вдруг осенило что я могу сделать WM_KEYDOWN и под ним select case с wParam скодом каждой кнопки!
но есть другой вопрос:
как пользоватся функцией GetKeyState чтоб узнать к примеру состояние NumLock'a...?

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 20:39 23-05-2007 | Исправлено: plazzmex, 20:48 23-05-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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 выключен

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;
                        }
 

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

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 02:00 24-05-2007
BugFixer

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

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

Про bitset почитай. Крайне полезно...
Что возвратит GetKeyState(VK_LSHIFT)? Некий набор нулей и единиц. Неважно, какого типа. (В данном случае - SHORT)
 
А для того, чтобы выяснить, что в бите с номером х - 0 или 1 делаем маску, в которой в бит с номером х ставим единицу, пересекаем с исследуемым значением и смотрим на результат.
 
В случае if нам интересно лишь то, 0 там или что нибудь ещё.
Конструкция if (a) есть сокращённая запись от if (a != 0)
Таким образом if (a & b) - это проверка, что (a & b) != 0, т.е. у a и b совпадает хоть один бит

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 07:16 24-05-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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
 
 

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

Поразрядное "И". Почитай про поразрядные операции (bitwise operators).

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:32 24-05-2007
plazzmex



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

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

Код:
unsigned scan_code=(lParam >> 16) & 0xFF;  
if(scan_code==0x2A)  // левый Shift  
if(scan_code==0x36)  // правый Shift

 
не совсем понял... можно поподробнее?  
и что такое unsigned scan_code=(lParam >> 16). это на C++?
потому что оно не работает.
 
а нельзя ли сделать вот так

Код:
switch (HIWORD(lParam))
                {
 
                    case 0x2A:
                        strcpy(_KeyName,"LEFT SHIFT");
                        InvalidateRect(hwnd,NULL,TRUE);
                        return 0;
                    case 0x36:
                        strcpy(_KeyName,"RIGHT SHIFT");
                        InvalidateRect(hwnd,NULL,TRUE);
                        return 0;
 

вроде работает...
а как я могу узнать scan code других клавиш?
 
 
 
Добавлено:
хотя нет.. теперь не работают все остальные кнопки..
 
Добавлено2:
вот я попробовал по другому. это вроде нормально:

Код:
 
                   case VK_SHIFT:
                        if(((lParam >> 16) & 0xFF) == 0x2A)
                        {
                            strcpy(_KeyName,"Left Shift");
                            InvalidateRect(hwnd,NULL,TRUE);
                            return 0;
                        }
                        if(((lParam >> 16) & 0xFF) == 0x36)
                        {
                            strcpy(_KeyName,"Right Shift");
                            InvalidateRect(hwnd,NULL,TRUE);
                            return 0;
                        }
 

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 19:25 24-05-2007 | Исправлено: plazzmex, 19:42 24-05-2007
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;
 
Ведь короче, верно? А почему не работает, надо смотреть.
Цитата:
...а как я могу узнать scan code других клавиш?
MSDN.

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 19:43 24-05-2007
Abs62



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

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

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

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

Да потому, что младший бит - это состояние переключателя типа CapsLock/NumLock, а индикатор нажатия - это старший бит.  
Так что не if(GetKeyState(VK_LSHIFT) & 1), а if(GetKeyState(VK_LSHIFT) & 0x8000).

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 22:33 24-05-2007
TeXpert



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

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 22:39 24-05-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;
 

помогите пожалуйста..

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 18:10 25-05-2007 | Исправлено: plazzmex, 20:02 26-05-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:03 26-05-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а как можно сделать глобальные кеи? например как в винампе ?
которые моя программа будет перехватывать от других приложений ?
я попытался с WM_USER но ничего не вышло..
 
и еще один вопрос:
как проверить работает ли какая нибудь программа на fullscreen.
на пример моя програмаа работает WS_EX_TOPMOST..
так вот чтоб когда пользователь запускает какую нибудь игру или презентацию  на fullscreen моя программа будет отменять TOPMOST.

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 19:08 27-05-2007
MorisA



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
           Здравствуйте!
Нужно создать какую нибудь заставку к программе, сама программа написана на MFC, т.е. когда запускаешь exe-к сначала проигрываеться какая-нибудь анимация, можно клип или flash-ку какую-нибудь встроить, а может проще будет просто с графикой поработать? Что мне лучше сначала изучить и что проще и быстрее будет в реализации?
Заранее благодарен за помощь.

Всего записей: 33 | Зарегистр. 04-12-2006 | Отправлено: 19:43 27-05-2007
Abs62



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

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

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

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:43 27-05-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 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