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

» C++ WinAPI

Автор: TeXpert
Дата сообщения: 13.02.2006 05:24
react

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

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

Abs62

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

Интересно, почему?

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

Добавлено:
dan2k5
Насколько понимаю, ты хочешь перехватывать нажатие на кнопки, которые не стандартны? Обычно на такую клаву навешивается свой драйвер, может это мешает?
Автор: Abs62
Дата сообщения: 13.02.2006 07:06
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, надо полагать.
Автор: dan2k5
Дата сообщения: 13.02.2006 22:05
Abs62

Большое спасибо. Все заработало как надо.
Автор: TeXpert
Дата сообщения: 14.02.2006 04:17
Abs62

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

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


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

Ну ясно, полагать можно. Думал, кто-нить знает наверняка.

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

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

IOCTL_STORAGE_LOAD_MEDIA не пробовал?
Автор: tomegadeth
Дата сообщения: 14.02.2006 18:42
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);
}
//---------------------------------------------------------------------------
Автор: TeXpert
Дата сообщения: 15.02.2006 03:44
Abs62

Цитата:
IOCTL_STORAGE_LOAD_MEDIA

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

tomegadeth
Спасибо, попробую.
Автор: dan2k5
Дата сообщения: 17.02.2006 22:50
Никак не могу разобраться с миксером. Нужно чтобы программа вырубала звук (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.
У кого есть какие мнения?
Автор: Mindless
Дата сообщения: 17.02.2006 23:35
я конечно не совсем специалист, да и не совсем по теме, но почему бы вместо lea и mov [eax] не пользоваться сразу mov "структура.значение", "значение" и потом использовать addr? если уж всё равно используется MASM, как я понимаю.
Автор: tomegadeth
Дата сообщения: 18.02.2006 02:24
dan2k5 смотри кусок на [more=С]

Код:
//---------------------------------------------------------------------------
BOOL MixerInit(){

m_nNumMixers = mixerGetNumDevs();
m_hMixer = NULL;
ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));

if(m_nNumMixers)
if (mixerOpen(&m_hMixer, 0, 0, NULL, MIXER_OBJECTF_MIXER) != MMSYSERR_NOERROR)
return FALSE;
if (mixerGetDevCaps((UINT)(m_hMixer), &m_mxcaps, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR)
    return FALSE;

return TRUE;

}
//---------------------------------------------------------------------------
BOOL MixerClose(){

BOOL bSucc = TRUE;
if (m_hMixer != NULL)
{
    bSucc = (mixerClose(m_hMixer) == MMSYSERR_NOERROR );
        m_hMixer = NULL;
    }
return bSucc;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
BOOL GetMasterControlType(DWORD ctrlType)
{
    if (m_hMixer == NULL) return FALSE;
    // get dwLineID
    MIXERLINE mxl;
    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;

    if (mixerGetLineInfo((HMIXEROBJ)(m_hMixer), &mxl, MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE)
        != MMSYSERR_NOERROR)
    {
        return FALSE;
    }

    // get dwControlID
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = ctrlType;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;

    if (mixerGetLineControls((HMIXEROBJ)(m_hMixer), &mxlc,
                         MIXER_OBJECTF_HMIXER |
                         MIXER_GETLINECONTROLSF_ONEBYTYPE)
        != MMSYSERR_NOERROR)
    {
        return FALSE;
    }

    // store dwControlID
    lstrcpy(m_strDstLineName, mxl.szName);
    lstrcpy(m_strMuteControlName, mxc.szName);
    m_dwMuteControlID = mxc.dwControlID;

    return TRUE;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
BOOL GetMasterValue(DWORD *lVal)
{
    if (m_hMixer == NULL)
    {
        return FALSE;
    }

    MIXERCONTROLDETAILS_UNSIGNED mxcdMute;
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = m_dwMuteControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = &mxcdMute;
    if (mixerGetControlDetails((HMIXEROBJ)(m_hMixer), &mxcd,
                             MIXER_OBJECTF_HMIXER |
                             MIXER_GETCONTROLDETAILSF_VALUE)
        != MMSYSERR_NOERROR)
    {
        return FALSE;
    }

    *lVal = mxcdMute.dwValue;
    return TRUE;
}
//---------------------------------------------------------------------------
BOOL SetMasterValue(DWORD lVal)
{
    if (m_hMixer == NULL) return FALSE;

    MIXERCONTROLDETAILS_UNSIGNED mxcdMute = { lVal };
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = m_dwMuteControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = &mxcdMute;
    if (mixerSetControlDetails((HMIXEROBJ)(m_hMixer), &mxcd,
                             MIXER_OBJECTF_HMIXER |
                             MIXER_SETCONTROLDETAILSF_VALUE)
        != MMSYSERR_NOERROR)
    {
        return FALSE;
    }
    
    return TRUE;
}
//---------------------------------------------------------------------------
вызов
void SomeFunc()
{
if(MixerInit()){
if(GetMasterControlType(MIXERCONTROL_CONTROLTYPE_VOLUME))
CheckBox1->Caption = m_strMuteControlName;
}

............
............

}

Автор: Mindless
Дата сообщения: 21.02.2006 20:56
Может кто-то подскажет как сделать навигацию в окошке с помощью кнопки TAB?

Я делаю так: родительскому- CreateWindowEx(WS_EX_CONTROLPARENT), дочерним -CreateWindowEx(WS_TABSTOP|WS_BORDER|WS_VISIBLE|WS_CHILD,HMENU(число какое-нибудь))

Не работает как надо

BS_DEFPUSHBUTTON тоже чёт не работает. Кнопка горит, но не жмётся
Автор: Abs62
Дата сообщения: 21.02.2006 22:45
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, и соответствующим образом это обрабатывать.
Автор: ShIvADeSt
Дата сообщения: 22.02.2006 01:00
Abs62

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

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

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

Автор: Mindless
Дата сообщения: 22.02.2006 04:08
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);
Автор: ShIvADeSt
Дата сообщения: 22.02.2006 04:19
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, поэтому возможно что неправильно отрабатывает ТАБ.
Автор: Mindless
Дата сообщения: 22.02.2006 14:06
ShIvADeSt
Использовать CreateWindow вместо CreateWindowEx с первым параметром 0 по-моему нет смысла - получается одно и тоже. Но я попробовал на всякий случай конечно - результат тот же.


А насчёт Hdsk, hWnd - я ,к счастью, не совсем дурак, создаю эдиты в оконной функции в сообщении WM_CREATE - по-моему это стандарт, соответственно hWnd - локальная переменная в этой функции, соответствующая окну, которое получило сообщение(WM_CREATE).

Наверное всё же Abs62 был прав, хотя мне такое положение кажется не логичным. В msdn'e насчёт WS_TABSTOP не написано ничего про диалоговые окна - значит должно работать со всеми.


Итак вопрос "не горит", но остаётся открытым.
Автор: gerrCrazzy
Дата сообщения: 22.02.2006 16:53
Mindless
IsDialogMessage() используешь?
если нет - то это ответ на твой вопрос
Автор: Mindless
Дата сообщения: 22.02.2006 21:44
gerrCrazzy
спасибо заработало, а где его правильно помещать ещё может подскажешь?

я почитал в WinApi справке - решил сделать так:

Код:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!IsDialogMessage(Hdsk,&msg))
        {
TranslateMessage(&msg);
DispatchMessage(&msg);
        }
    }
Автор: gerrCrazzy
Дата сообщения: 23.02.2006 11:12
Mindless

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

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

А я походу ступил, я видел в справке эти сообщения, но не придал им значения.
Автор: Abs62
Дата сообщения: 23.02.2006 20:25
Mindless
Это ты правильно решил.
Осталось совсем немного - сделать проблемное окно окном диалога. Что мешает?[b]
Автор: Mindless
Дата сообщения: 23.02.2006 21:25
Abs62
Не знаю, почему-то не люблю диалоги
Автор: Abs62
Дата сообщения: 24.02.2006 12:08
Mindless
А их не надо любить - ими надо пользоваться.
Автор: ShIvADeSt
Дата сообщения: 26.02.2006 01:53
Abs62

Цитата:
Осталось совсем немного - сделать проблемное окно окном диалога. Что мешает?

В чем именно проблема? Я вообще сам окна не создаю, а беру их из ресурса.

Цитата:

hMain:=DialogBox(hInstance, PChar(MAINBOX), 0, @DlgFunc);

описание функции читаем в хелпе и правильно описываем case и результат из него. ибо возможны траблы.
Автор: Mindless
Дата сообщения: 08.03.2006 22:53
Может подскажет кто-нибудь, как сделать красивый Edit-control, с фоновым рисунком. Если просто заменять процедуру и в WM_PAINT рисовать, то при нажатии кнопки получается, что вылазит по центру белая полоска с введённым текстом на высоту текста. Как её убрать, или может есть какой-то другой способ сделать контрол?
Автор: ShIvADeSt
Дата сообщения: 09.03.2006 00:53
Mindless
http://www.codeguru.com/cpp/controls/editctrl/backgroundcolor/article.php/c6857/
почитай здесь
в частности тебе нужно вот это

Цитата:

The WM_CTLCOLOREDIT message is sent to the parent window of an edit control when the control is about to be drawn. By responding to this message, the parent window can use the given device context handle to set the text and background colors of the edit control.

WM_CTLCOLOREDIT
hdcEdit = (HDC) wParam; // handle of display context
hwndEdit = (HWND) lParam; // handle of static control
как только получаешь ДС, делаешь ему DC->SetBkMode(TRANSPARENT);

тогда рисунок за буквами будет оставаться.
Автор: Brodyaga
Дата сообщения: 11.03.2006 16:36
Привет всем.
Я не знаю, оффтоп это или нет?
Есть ли программы для рисования интерфейса с GUI, для экспорта кода этого интерфейса в программу?
Просто компилю Блоодшедом, а в нем ессесно стандартными винапи не обойдешься.
Автор: TeXpert
Дата сообщения: 13.03.2006 03:59
Brodyaga

Цитата:
Есть ли программы для рисования интерфейса с GUI, для экспорта кода этого интерфейса в программу?

Может, имеет смысл расшифровать, что сие означает?
Автор: Brodyaga
Дата сообщения: 14.03.2006 19:15
Имеет.
Например, легко расположить 73 элемента в виндовс программе исключительно с текстовым компилятором?Нет.
Может имеются программы для рисования этих самых элементов и расположениях их в окне?
Только для рисования.
Автор: tomegadeth
Дата сообщения: 14.03.2006 23:21
Brodyaga Понятно - тебе нужно задизайнить интерфейс и полученый код откомпилить Блоодшедом. Встречал такое - но только для генерации ресурсов - рисуешь диалогбокс, на него кидаешь меню, кнопки, едиты и т.д. Он тебе создает .RC выходной файл который включаещь в проект. Я это пользовал для написания прог на masm32.
Если устроит - вот один такой - Borland Resource Workshop называется - есть в поставке Borland C++ 4,5,6.
З.Ы. еще есть Resource Builder 2.4

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

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


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