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

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

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

TeXpert



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

Цитата:
Вопрос в следующем: можно ли каким-то образом програмно нажать кнопку в другой    
 программе при заблокированном экране, если да то как ?

Можно также внедрением dll в адресное пространство соответствующего процесса, это проще осуществить на NT-платформах.
 
Abs62

Цитата:
Правда, и другая не отреагирует до снятия блокировки.

Интересно, почему?
 
Внимание, вопрос: какое сообщение рассылается при динамическом монтировании диска (например, USB Flash)?
 
Добавлено:
dan2k5
Насколько понимаю, ты хочешь перехватывать нажатие на кнопки, которые не стандартны? Обычно на такую клаву навешивается свой драйвер, может это мешает?

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

Всего записей: 3620 | Зарегистр. 08-02-2003 | Отправлено: 06:24 13-02-2006
Abs62



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

Цитата:
Можно также внедрением dll в адресное пространство соответствующего процесса, это проще осуществить на NT-платформах.

А зачем?

Цитата:
Интересно, почему?
 
Потому же, почему подвисает SendMessage. "An application sends a BM_CLICK message to simulate the user clicking a button. This message causes the button to receive the WM_LBUTTONDOWN and WM_LBUTTONUP messages, and the button's parent window to receive a BN_CLICKED notification message" (MSDN). Получив WM_LBUTTONDOWN, кнопка попытается сперва отрисоваться в нажатом состоянии, что ей не удастся до снятия блокировки.

Цитата:
Внимание, вопрос: какое сообщение рассылается при динамическом монтировании диска (например, USB Flash)?
 
WM_DEVICECHANGE, надо полагать.

Всего записей: 6092 | Зарегистр. 22-10-2005 | Отправлено: 08:06 13-02-2006 | Исправлено: Abs62, 08:17 13-02-2006
dan2k5



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
 
Большое спасибо. Все заработало как надо.

Всего записей: 191 | Зарегистр. 14-06-2005 | Отправлено: 23:05 13-02-2006
TeXpert



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

Цитата:
А зачем?

Этот способ даёт, как сам понимаешь, наиболее полный контроль, иногда приходится оконную процедуру захватывать. Ну, конечно, по возможности надо делать проще.
 

Цитата:
WM_DEVICECHANGE, надо полагать

Ну ясно, полагать можно. Думал, кто-нить знает наверняка.
 
И ещё вопрос: как программно закрыть лоток CD/DVD? Извлечь -- ясно, а вот обратное нет(.

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

Всего записей: 3620 | Зарегистр. 08-02-2003 | Отправлено: 05:17 14-02-2006
Abs62



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

Цитата:
И ещё вопрос: как программно закрыть лоток CD/DVD? Извлечь -- ясно, а вот обратное нет(.

IOCTL_STORAGE_LOAD_MEDIA не пробовал?

Всего записей: 6092 | Зарегистр. 22-10-2005 | Отправлено: 08:30 14-02-2006
tomegadeth



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

Код:
 
//---------------------------------------------------------------------------
#include "mmsystem.h"
//---------------------------------------------------------------------------
void CD_Eject(char Drive, bool open)
{
   char mmbuff[30] =  {0,};
   wsprintf(mmbuff, "open cdaudio!%c: alias drive%c", Drive, Drive);
 
   mciSendString(mmbuff, 0, 0, 0);
 
   wsprintf(mmbuff, "set drive%c door %s", Drive, open ? "open wait" : "closed wait");
 
   mciSendString(mmbuff, 0, 0, 0);
}
//---------------------------------------------------------------------------
 

вызов:
   CD_Eject('I', true);  // открываем
   CD_Eject('I', false); // закрываем

Всего записей: 560 | Зарегистр. 22-11-2004 | Отправлено: 19:42 14-02-2006 | Исправлено: tomegadeth, 19:44 14-02-2006
TeXpert



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

Цитата:
IOCTL_STORAGE_LOAD_MEDIA

Кажется, пробовал (это было лет семь назад), по-моему, не срабатывало. Тем не менее, спасибо!
 
tomegadeth
Спасибо, попробую.

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

Всего записей: 3620 | Зарегистр. 08-02-2003 | Отправлено: 04:44 15-02-2006
Sept



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

Всего записей: 40 | Зарегистр. 08-02-2006 | Отправлено: 15:52 15-02-2006 | Исправлено: Sept, 15:53 15-02-2006
dan2k5



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Никак не могу разобраться с миксером. Нужно чтобы программа вырубала звук (mute).
Смотрел MSDN, там только описания функций и структур, даже примера нет.
Громкость регулируется, только по-моему что-то я делаю неправильно.
 
в начале вызываю

Цитата:
    invoke mixerOpen, offset hmx, 0, 0, 0, 0

функция SetVolume меняет громкость на 1%.

Цитата:
SetVolume proc dwFlag:DWORD
local mxcd:MIXERCONTROLDETAILS
local dwVolume:DWORD
 
    lea eax, [mxcd]
    assume eax: ptr MIXERCONTROLDETAILS
    mov [eax].cbStruct, sizeof mxcd
    mov [eax].dwControlID, 0
    mov [eax].hwndOwner, 0
    mov [eax].cChannels, 1
    mov [eax].cbDetails, 4
    lea esi, [dwVolume]
    mov [eax].paDetails, esi
    assume eax: nothing
    
    invoke mixerGetControlDetails, hmx, addr mxcd, MIXER_GETCONTROLDETAILSF_VALUE + MIXER_OBJECTF_HMIXER
    mov eax, dwVolume
    .if dwFlag == VOLUME_DOWN
        sub eax, 28fh
        .if eax > 10000h
            xor eax, eax
        .endif
    .elseif dwFlag == VOLUME_UP
        add eax, 28fh
    .endif
    mov dwVolume, eax
    invoke mixerSetControlDetails, hmx, addr mxcd, MIXER_GETCONTROLDETAILSF_VALUE + MIXER_OBJECTF_HMIXER
    ret
SetVolume endp

Я не совсем уверен, в правильности заполнения структуры mxcd.
У кого есть какие мнения?

Всего записей: 191 | Зарегистр. 14-06-2005 | Отправлено: 23:50 17-02-2006 | Исправлено: dan2k5, 23:52 17-02-2006
Mindless



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я конечно не совсем специалист, да и не совсем по теме, но почему бы вместо lea и mov [eax] не пользоваться сразу mov "структура.значение", "значение" и потом использовать addr? если уж всё равно используется MASM, как я понимаю.

Всего записей: 32 | Зарегистр. 31-10-2004 | Отправлено: 00:35 18-02-2006
tomegadeth



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

----------
shr eax, 16. ▄▄▄▄▄° Догоним и перегоним Африку °▄▄▄▄▄

Всего записей: 560 | Зарегистр. 22-11-2004 | Отправлено: 03:24 18-02-2006 | Исправлено: tomegadeth, 03:37 18-02-2006
Mindless



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может кто-то подскажет как сделать навигацию в окошке с помощью кнопки TAB?
 
Я делаю так: родительскому- CreateWindowEx(WS_EX_CONTROLPARENT), дочерним -CreateWindowEx(WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD,HMENU(число какое-нибудь))
 
Не работает как надо
 
BS_DEFPUSHBUTTON тоже чёт не работает. Кнопка горит, но не жмётся

Всего записей: 32 | Зарегистр. 31-10-2004 | Отправлено: 21:56 21-02-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mindless
Обычно такие вещи делаются на базе окна диалога. И стиль WS_EX_CONTROLPARENT применяется для дочерних окон диалогового окна, если они в свою очередь имеют дочерние окна, между которыми надо осуществлять навигацию клавишей TAB. "If the search for the next control with the WS_TABSTOP style encounters a window with the WS_EX_CONTROLPARENT style, the system recursively searches the window's children" (C) MSDN.
В обычном окне этот стиль будет просто проигнорирован, ежели я не ошибаюсь. Так что если очень надо сделать подобие диалогового окна в окне обычном, придётся всё это делать вручную - отлавливать нажатие TAB, Shift+TAB, Enter, и соответствующим образом это обрабатывать.

Всего записей: 6092 | Зарегистр. 22-10-2005 | Отправлено: 23:45 21-02-2006
ShIvADeSt



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

Цитата:
 Так что если очень надо сделать подобие диалогового окна в окне обычном, придётся всё это делать вручную - отлавливать нажатие TAB, Shift+TAB, Enter, и соответствующим образом это обрабатывать.

Ничего подобного, для этого и есть флаг
Цитата:
WS_TABSTOP
,который означает, что на данный контрол можно попасть при помощи ТАБа.Mindless

Цитата:
 CreateWindowEx(WS_EX_CONTROLPARENT)
родительское обычно так не создается, по крайней мере я его делаю без Ex, дай полный код создания окна и контрола, по ходу ошибка где то в синтаксисе.
 


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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:00 22-02-2006
Mindless



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Родительское
 
Hdsk=CreateWindowEx(0,lpszGetPassWindowClass, lpszTitle, WS_BORDER|WS_VISIBLE|WS_SYSMENU|WS_CAPTION, (rc.right-rc.left)/2-106, (rc.bottom-rc.top)/2-120, 214, 130, owner, NULL, hInst, NULL);
 
Дочернии эдиты
edit[0]=CreateWindowEx(0,WC_EDIT,NULL,WS_TABSTOP|ES_AUTOHSCROLL|ES_PASSWORD|WS_BORDER|WS_VISIBLE|WS_CHILD,4,18,200,18,hWnd,HMENU(1),hInst,NULL);
 
edit[1]=CreateWindowEx(0,WC_EDIT,NULL,WS_TABSTOP|ES_AUTOHSCROLL|ES_PASSWORD|WS_BORDER|WS_VISIBLE|WS_CHILD,4,52,200,18,hWnd,HMENU(2),hInst,NULL);

Всего записей: 32 | Зарегистр. 31-10-2004 | Отправлено: 05:08 22-02-2006 | Исправлено: Mindless, 05:08 22-02-2006
ShIvADeSt



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

Цитата:
Hdsk=CreateWindowEx(0,lpszGetPassWindowClass, lpszTitle, WS_BORDER|WS_VISIBLE|WS_SYSMENU|WS_CAPTION, (rc.right-rc.left)/2-106, (rc.bottom-rc.top)/2-120, 214, 130, owner, NULL, hInst, NULL);

Используй CreateWindow (так как это у тебя главное окно, далее, вот что странно

Цитата:
edit[0]=CreateWindowEx(0,WC_EDIT,NULL,WS_TABSTOP|ES_AUTOHSCROLL|ES_PASSWORD|WS_BORDER|WS_VISIBLE|WS_CHILD,4,18,200,18,hWnd,HMENU(1),hInst,NULL);

у тебя родительское окно здесь hWnd, а а у него хэндл Hdsk, поэтому возможно что неправильно отрабатывает ТАБ.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:19 22-02-2006
Mindless



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Использовать CreateWindow вместо CreateWindowEx с первым параметром 0 по-моему нет смысла - получается одно и тоже. Но я попробовал на всякий случай конечно - результат тот же.
 
 
А насчёт Hdsk, hWnd - я ,к счастью, не совсем дурак, создаю эдиты в оконной функции в сообщении WM_CREATE - по-моему это стандарт, соответственно hWnd - локальная переменная в этой функции, соответствующая окну, которое получило сообщение(WM_CREATE).
 
Наверное всё же Abs62 был прав, хотя мне такое положение кажется не логичным. В msdn'e насчёт WS_TABSTOP не написано ничего про диалоговые окна - значит должно работать со всеми.
 
 
Итак вопрос "не горит", но остаётся открытым.

Всего записей: 32 | Зарегистр. 31-10-2004 | Отправлено: 15:06 22-02-2006
gerrCrazzy



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mindless
IsDialogMessage() используешь?
если нет - то это ответ на твой вопрос

Всего записей: 63 | Зарегистр. 27-12-2002 | Отправлено: 17:53 22-02-2006
Mindless



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gerrCrazzy
спасибо заработало, а где его правильно помещать ещё может подскажешь?
 
я почитал в WinApi справке - решил сделать так:

Код:
 
    while (GetMessage(&msg, NULL, 0, 0))  
    {
        if (!IsDialogMessage(Hdsk,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 

 
кстати BS_DEFPUSHBUTTON всё равно не работает )

Всего записей: 32 | Зарегистр. 31-10-2004 | Отправлено: 22:44 22-02-2006 | Исправлено: Mindless, 23:25 22-02-2006
gerrCrazzy



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

Цитата:
кстати BS_DEFPUSHBUTTON всё равно не работает

Обрабатываешь сообщения за номерами WM_USER и (WM_USER+1)? ,
если да, то это кофликт с DM_GETDEFID и DM_SETDEFID, которые
и отвечают defpushbutton.
если нет - в ответ на DM_GETDEFID
возвращатй ID кнопки, которая считается default

Всего записей: 63 | Зарегистр. 27-12-2002 | Отправлено: 12:12 23-02-2006
Открыть новую тему     Написать ответ в эту тему

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