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

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

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

Collapse_Troll

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
tomegadeth
понял, отличная идея, спасибо! =)

Всего записей: 792 | Зарегистр. 05-08-2006 | Отправлено: 22:48 26-11-2006
HANDLE

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

Цитата:
Нужно в общем появление окошка с выбором директории,

 

Код:
 
#include <shlobj.h>
 
int CALLBACK ExpandFolder(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
  if (uMsg == BFFM_INITIALIZED)
  {
    ::SendMessage(hWnd, BFFM_SETSELECTION, 1, lpData);
  }
  return 0;
}
 
void CRandomStringDlg::OnBnClickedOk()
{
  TCHAR szPath[MAX_PATH];
  lstrcpy(szPath, lpLastPath);      //  папка, которую хотим развернуть в дереве
 
  BROWSEINFO bi = { 0 };
  bi.hwndOwner = m_hWnd;            //  окно, куда будут посылаться сообщения
  bi.lpszTitle = _T("Выбор ....");  //  пояснительная надпись
  bi.ulFlags = BIF_NEWDIALOGSTYLE;  //  флаги
  bi.lpfn = ExpandFolder;           //  call-back
  bi.lParam = (LPARAM)szPath;       //  
     
  LPITEMIDLIST lpItemIdList = SHBrowseForFolder(&bi);
  if (lpItemIdList)
  {
    if (SHGetPathFromIDList(lpItemIdList, szPath))
    {
// действия с выбранной папкой
 
    }
 
// освобождаем память
    IMalloc *pMalloc;
    if (SUCCEEDED(SHGetMalloc(&pMalloc)))
    {
      pMalloc->Free(lpItemIdList);
      pMalloc->Release();
    }
  }
 
// а если указать корневую папку, то выбирать можно только внутри её
#include <shfolder.h>
 
// Выбираем только внутри %PROGRAMFILES%
  LPITEMIDLIST lpRootItemIdList;
  SHGetSpecialFolderLocation(m_hWnd, CSIDL_PROGRAM_FILES, &lpRootItemIdList);
  bi.pidlRoot = lpRootItemIdList;
 






ответ уже был дан, зачем дублировать?

Всего записей: 364 | Зарегистр. 25-02-2006 | Отправлено: 06:11 27-11-2006 | Исправлено: ShIvADeSt, 07:09 27-11-2006
linder



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите пожалуйста как записать звук (речь) с микрофона в Visual C++
Желательно приведите пример программы реализующей это, или подскажите
где про это можно почитать...
 
а следующий шаг для меня быстрое преобразование фурье и  получение спектра!

Всего записей: 141 | Зарегистр. 14-09-2005 | Отправлено: 08:51 27-11-2006
vkarpov1968

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Требуется помощь. C++Builder. Надо написать передачу строки между приложениями. Был выбран самый простой вариант - через SendMessage
передающая часть:  
HWND hApp = FindWindow(NULL, "Form1");
if (hApp!=0)
{
      COPYDATASTRUCT  cds;
      cds.dwData = 1;
      cds.cbData = strlen(CmdLine);
      cds.lpData = CmdLine;
 
      SendMessage(HWND_BROADCAST, WM_COPYDATA, NULL, (LPARAM)&cds);
                                                         
 }
 
А вот с приёмником проблема
было опробовано 2 варианта
1. перехватчик Application->OnMessage  
2. Application->HookMainWindow()
 
ни до одной функции сообщение не доходит, хотя сообщение WM_CLOSE до приложения доходит легко.
Что делать, в каком месте поймать сообщение????

Всего записей: 55 | Зарегистр. 30-05-2005 | Отправлено: 10:19 27-11-2006
tomegadeth



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vkarpov1968 копни в сторону RegisterWindowMessage
 
Добавлено:
решение через WM_COPYDATA

Всего записей: 560 | Зарегистр. 22-11-2004 | Отправлено: 10:26 27-11-2006
vkarpov1968

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tomegadeth
Спасибо огромное. COPYDATA в таком варианте работает.
А RegisterWindowMessage работает, только отсылать надо PostMessage - тогда доходит, но свою структуру не передать, только циферки.

Всего записей: 55 | Зарегистр. 30-05-2005 | Отправлено: 11:42 27-11-2006 | Исправлено: vkarpov1968, 11:52 27-11-2006
Collapse_Troll

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
tomegadeth
программу управления сидюком сделал, работает. Если лоток сидюка уже внутри, то выход из метода закрытия происходит либо за секунду, либо за меньший промежуток. Но если жмакать на кнопку на самом сидюке то выезжает/заезжает быстрее. Может влияют другие обращения к сидюку(автозапуск, таблички "Какое действие с диском следует выполнять Windows?") Может можно как-то экстренно закрывать/открывать сидюк, не обращая внимание на то, есть ли к нему обращение или нет? Пробовал убирать 'wait' из
Код:
mciSendString("Set cdaudio door open wait", NULL, 0, NULL);
, imho так же долго думает между заездом/выездом

Всего записей: 792 | Зарегистр. 05-08-2006 | Отправлено: 03:10 29-11-2006
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Collapse_Troll
ЁRD Commander, например, наглухо блокирует кнопку CD/DVD. Как это она делает? Очевидно, есть какие-то команды, думаю, через DeviceIOControl можно выйти на них.

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

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 05:02 29-11-2006
ShIvADeSt



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

Цитата:
ЁRD Commander, например, наглухо блокирует кнопку CD/DVD. Как это она делает?

аналогично блокирует и нера когда пишет диск, возможно перехватывают вызовы АПИ функций, либо есть другие команды, которые позволяют игнорировать.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:07 29-11-2006
tomegadeth



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот - но работать будет только под
Цитата:
Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
наглухо заблокирует девайс.....
 

Код:
#include <windows.h>
#include <Winioctl.h>
 
unsigned long LockCD(char drive, bool lockdrive)
{
    unsigned long junk, lResult;
    char   drv[8] = {'\\', '\\', '.', '\\', drive, ':', 0};
    
    PREVENT_MEDIA_REMOVAL pmr = {lockdrive};
    
    void * hDevice = CreateFile(drv, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    
    if(hDevice != INVALID_HANDLE_VALUE)
    {
        if(GetDriveType(&drv[4]) == DRIVE_CDROM)
            lResult = DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &junk, 0);
        CloseHandle(hDevice);
    }
    
    return lResult;
}
 
void main()
{
    LockCD('f', true);  // блокирует
    LockCD('f', false); // разблокирует
}

 
Добавлено:

Цитата:
Может можно как-то экстренно закрывать/открывать сидюк, не обращая внимание на то, есть ли к нему обращение или нет
может и можно - но через ASPI или на низком уровне - не было необходимости, не ковырял...

Всего записей: 560 | Зарегистр. 22-11-2004 | Отправлено: 10:39 29-11-2006 | Исправлено: tomegadeth, 11:08 29-11-2006
daMIR



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если честно мне все равно мало понятны эти листинги, может подскажите названия справочников/учебников по API? Искал через поисковик, но ничего толкового не нашел. А втыкать эту конструкцию я вообще собирался в Форт..

Всего записей: 1757 | Зарегистр. 14-03-2004 | Отправлено: 12:21 29-11-2006
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Неужто Форт ещё жив?? Я как его изучал, так ни разу не использовал. Уж и забыл, наверное.
А чё тут справочников искать? Всё есть в MSDN. По крайней мере о Wind-ах.
ИМХО задержки - это драйвера уровня ядра. Надо ж всех опросить, не возражают ли они, чтоб лотком двигали. Если ты жмёшь кнопку, то лоток тебя сразу слушается, а всех не спрашивают - только рассылают уведомление. Впрочем, счас проверил на Far-е, он тоже умеет лотком рулить, так при пустом лотке время реакции ~0.3 секунды в обе стороны.
Для блокирования кнопки имеется специальная команда в протоколе ATAPI. Вообще, для низкоуровнего управления девайсами (точнее, их драйверами) нужно в первую очередь смотреть DeviceIoControl(). Там же, в MSDN.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 13:24 29-11-2006
Thritt



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажите пожалуйста в чем ошибка, обрабатываю сообщение WM_DRAWITEM, хочу сделать хайлайт для кнопок:  
case WM_DRAWITEM:
        pdis = LPDRAWITEMSTRUCT(lParam);
        cbtndc = CreateCompatibleDC(pdis->hDC);
        if (pdis->itemState & ODS_SELECTED)
        {
            switch (pdis->CtlID)
            {
            case ID_BTN1:
                SelectObject(cbtndc, bm3);
                break;
            case ID_BTN2:
                SelectObject(cbtndc, bm5);
                break;
            }
        }
        else
        {
//почемуто вот эта часть кода не выполняется или игнорируется ODS_HOTLIGHT
//-----------
            if (pdis->itemState & ODS_HOTLIGHT)
            {
                switch(pdis->CtlID)
                {
                case ID_BTN1:
                    SelectObject(cbtndc, bm6);
                    break;
                case ID_BTN2:
                    SelectObject(cbtndc, bm7);
                    break;
                }
            }
//--------
            else
            {
                switch(pdis->CtlID)
                {
                case ID_BTN1:
                    SelectObject(cbtndc, bm1);
                    break;
                case ID_BTN2:
                    SelectObject(cbtndc, bm4);
                    break;
                }
            }
        }
        BitBlt(pdis->hDC, 0, 0, 130, 35, cbtndc, 0, 0, SRCCOPY);
        DeleteDC(cbtndc);
        break;

Всего записей: 79 | Зарегистр. 10-07-2006 | Отправлено: 01:02 03-12-2006
ShIvADeSt



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

Цитата:
почемуто вот эта часть кода не выполняется или игнорируется ODS_HOTLIGHT

нету у кнопок данного флага, читай хелп. Хотлайт только для менюшек (для Button ов по другому это все делается).

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:15 04-12-2006
xdude



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи, такой вопрос возник: использую CHtmlDialog как базовый класс для диалога. Получаю указатель на элемент в HTML-документе этого диалога, и юаю функцию getAttribute, чтобы получить значение параметра value="bla-bla" в этом ХТМЛе. getAttribute возвращает мне VARIANT, в котором параметр bstrVal содержит ссылку на строку "bla-bla". Далее чудеса: если юзаю bstrVal в функции FormatMessage, MessageBox и т.д. (т.е., в чисто API-функциях), выдается нормальный результат: bla-bla. Как только пытаюсь передать ее как параметр в функцию wcslen(v.bstrVal) или sprintf("Value: %S\n",v.bstrVal) - программа выполняет недопустимую операцию. То же самое, если я этим указателем инициализирую строку std::wstring. Я не силен во всяких там адресных пространствах, но возможно, нужно заюзать на нее что-то типа GlobalLock или LocalLock или подобное этому. чтобы получить нормальный указатель? Тогда, как это сделать, тупым тайп-кастом, ведь в эти функции нужно передавать не указатель, а HANDLE?
 
Добавлено:
Ага, я понял. в чем там проблема. Ошибка возникает, когда поле не заполнено, а если оно заполнено - то все ОК. Хотя, опять же не понятно: почему виндовые функции (MessageBox, например) при этом работают без ошибок, а стандартные C/C++ тупят?

Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 02:38 12-12-2006
Collapse_Troll

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
спасибо всем кто помогал с программой для управления сидюком, в особенности tomegadeth.
 
p.s.:Кстати всех с прошедшими и с наступающим СНГ!

Всего записей: 792 | Зарегистр. 05-08-2006 | Отправлено: 00:33 10-01-2007
YasonDelAlt

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую!

Подскажите, есть функции на подобии BitBlt() но без использования контекстов устройств, а то мне нужно создавать в памяти Bitmap, потом на основе другого Bitmap'а (точнее из его кусков), заполнять, а далее скармливать нужной функции, которая и разбирается куда, как и где вывобить.
Помогите плиз! Я еще очень маленький, в школу хожу.

Всего записей: 12 | Зарегистр. 24-05-2006 | Отправлено: 12:02 10-01-2007
xdude



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YasonDelAlt
Создается Memory DC, на нем делается SelectObject, в который передается HBITMAP, и теперь рисуя на этом DC ты рисуешь на битмапе.

Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 14:51 10-01-2007
Nikosss



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня вопрос. Как нужно объявить массив, состоящий из компонент Button?
К примеру пишу:
 
TButton a[10];
 
Мне это нужно, чтобы иметь возможность перебирать через цикл компоненты Button1, Button2, Buttton3, ... Может кто-то подскажет лучший вариант?

Всего записей: 46 | Зарегистр. 11-07-2005 | Отправлено: 18:06 12-01-2007
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nikosss
Во-первых, какое отношение дурацкое), извиняюсь, Delphi/Builder имеет отношение к WinAPI?
Во-вторых, задай вопрос в другой теме, а по секрету скажу, что есть решение проще: используй свойство Tag.

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

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 19:07 12-01-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