Página 1 de 2
API de controle de volume do Windows
Enviado: 12 Abr 2023 23:34
por cjp
Pessoal, alguém saberia como faço para controlar o volume do som do computador com Windows 10 Pro de dentro de um programa feito em Harbour console?
Pesquisei API do Windows, achei essa: EndpointVolumeChanger. Mas não consegui usar.
Se der para apenas ligar e desligar o som, já está ótimo.
API de controle de volume do Windows
Enviado: 30 Jul 2023 00:58
por cjp
Alguém me ajuda?
API de controle de volume do Windows
Enviado: 04 Ago 2023 09:58
por clodoaldomonteiro
Olá.
Acho que vc poderia tentar usando Virtual Key, em C.
Código: Selecionar todos
#pragma BEGINDUMP
/////////////////////////////////////////////////////////////////////////////
//Pressionar a tecla alt
//https://docs.microsoft.com/pt-br/windows/win32/inputdev/virtual-key-codes
HB_FUNC( _VKALT )
{
keybd_event (VK_MENU, 0, 0, 0 );
keybd_event (VK_MENU, 0, KEYEVENTF_KEYUP, 0);
}
/////////////////////////////////////////////////////////////////
//Pressionar qualquer tecla
HB_FUNC( _VKLETRA )
{
keybd_event (hb_parnl(1), 0, 0, 0 );
keybd_event (hb_parnl(1), 0, KEYEVENTF_KEYUP, 0);
}
/////////////////////////////////////////////////////////////////
//Pressionar seta baixo
HB_FUNC( _VKSETABAI )
{
int n; //= 1;
for(n = 1; n <= hb_parni(1); n++) {
keybd_event (VK_DOWN, 0, 0, 0 );
keybd_event (VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
}
}
#pragma ENDDUMP
Código: Selecionar todos
...
...
Case nMenuEvent == 101
Mnu()
CBC1(.T.)
_VKAlt()
_VKLetra(0x54)
...
...
API de controle de volume do Windows
Enviado: 10 Ago 2023 11:17
por carlaoonline
Bom dia!
Pode também tentar usar o nircmd.exe com o comando Hb_run() ou EXECUTE FILE
https://nircmd.nirsoft.net
Se não me engano para baixar o volume usa o parâmetro changesysvolume com o decremento/
incremento:
E para quem tem o MiniGui Extend instalado, tem um exemplo na pasta:
C:\MiniGUI\SAMPLES\Advanced\NirCmdDll
Vou deixar o codigo MiniGui do exemplo aqui para estudar a parte da execução:
Código: Selecionar todos
/*
* MiniGUI DLL Demo
*
* Sample for using NirCmd DLL
* For more information about NirCmd:
* http://www.nirsoft.net/utils/nircmd.html
*
* (c) 2010-2016 Grigory Filatov <gfilatov@inbox.ru>
*/
#include "minigui.ch"
#include "hbdyn.ch"
Procedure Main
SET HELPFILE TO 'NirCmd.chm'
SET FONT TO _GetSysFont(), 9
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 400 ;
HEIGHT 230 + iif(IsWinXPorLater(), GetBorderHeight(), 0) ;
TITLE 'NirCmd DLL Test' ;
ICON 'NirCmd.ico' ;
MAIN ;
ON INTERACTIVECLOSE MsgYesNo ( 'Are You Sure ?', 'Exit' )
DEFINE BUTTON Button_1
ROW 10
COL 10
WIDTH 170
CAPTION 'Open CD-ROM Door'
ACTION OpenCDRom_Click()
END BUTTON
DEFINE BUTTON Button_2
ROW 40
COL 10
WIDTH 170
CAPTION 'Close CD-ROM Door'
ACTION CloseCDRom_Click()
END BUTTON
DEFINE BUTTON Button_3
ROW 70
COL 10
WIDTH 170
CAPTION 'Mute System Volume'
ACTION MuteVolume_Click()
END BUTTON
DEFINE BUTTON Button_4
ROW 100
COL 10
WIDTH 170
CAPTION 'Unmute System Volume'
ACTION UnmuteVolume_Click()
END BUTTON
DEFINE BUTTON Button_5
ROW 130
COL 10
WIDTH 170
IF IsWinXPorLater()
CAPTION 'Show the task manager'
ACTION TaskManager_Click()
ELSE
CAPTION 'Turn Monitor Off'
ACTION MonitorOff_Click()
ENDIF
END BUTTON
DEFINE BUTTON Button_5a
ROW 160
COL 10
WIDTH 170
CAPTION 'Save screenshot in clipboard'
ACTION savescreenshot_Click()
END BUTTON
DEFINE BUTTON Button_6
ROW 10
COL 200
WIDTH 150
CAPTION 'Start the screen saver'
ACTION StartSS_Click()
END BUTTON
DEFINE BUTTON Button_7
ROW 40
COL 200
WIDTH 150
CAPTION 'Disable the screen saver'
ACTION DisableSS_Click()
END BUTTON
DEFINE BUTTON Button_8
ROW 70
COL 200
WIDTH 150
CAPTION 'Enable the screen saver'
ACTION EnableSS_Click()
END BUTTON
DEFINE BUTTON Button_9
ROW 100
COL 200
WIDTH 150
CAPTION 'Clear the clipboard'
ACTION ClearClipboard_Click()
END BUTTON
DEFINE BUTTON Button_10
ROW 130
COL 200
WIDTH 150
CAPTION 'Display a tray balloon'
ACTION TrayBalloon_Click()
END BUTTON
DEFINE BUTTON Button_10a
ROW 160
COL 200
WIDTH 150
IF IsWinXPorLater()
CAPTION 'Flash this window'
ACTION FlashWin_Click()
ELSE
CAPTION 'Cancel'
ACTION ThisWindow.Release()
ENDIF
END BUTTON
ON KEY F1 ACTION DISPLAY HELP MAIN
ON KEY ESCAPE ACTION ThisWindow.Release()
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
Procedure OpenCDRom_Click()
DoNirCmd( "cdrom open" )
Return
Procedure CloseCDRom_Click()
DoNirCmd( "cdrom close" )
Return
Procedure MuteVolume_Click()
DoNirCmd( "mutesysvolume 1" )
Return
Procedure UnmuteVolume_Click()
DoNirCmd( "mutesysvolume 0" )
Return
Procedure MonitorOff_Click()
MsgAlert('Monitor will be off for 10 seconds!', 'Warning')
DoNirCmd( "monitor off" )
inkey(10)
DoNirCmd( "monitor on" )
Return
Procedure StartSS_Click()
DoNirCmd( "screensaver" )
Return
Procedure EnableSS_Click()
DoNirCmd( [regsetval sz "HKCU\control panel\desktop" "ScreenSaveActive" 1] )
Return
Procedure DisableSS_Click()
DoNirCmd( [regsetval sz "HKCU\control panel\desktop" "ScreenSaveActive" 0] )
Return
Procedure ClearClipboard_Click()
DoNirCmd( "clipboard clear" )
Return
Procedure TrayBalloon_Click()
EXECUTE FILE "nircmd.exe" PARAMETERS [trayballoon "Hello" "This is the text that will be appear inside the balloon!" "shell32.dll,-154" 10000]
Return
Procedure TaskManager_Click()
EXECUTE FILE "nircmd.exe" PARAMETERS "sendkeypress ctrl+shift+esc"
Return
Procedure savescreenshot_Click()
Form_1.Minimize
EXECUTE FILE "nircmd.exe" PARAMETERS "savescreenshot *clipboard*"
Form_1.Restore
Return
Procedure FlashWin_Click()
EXECUTE FILE "nircmd.exe" PARAMETERS [win flash title 'NirCmd DLL Test']
Return
// BOOL WINAPI DoNirCmd(LPSTR lpszCommand)
Function DoNirCmd( cCommand )
Return HMG_CallDLL( "NIRCMD.DLL", HB_DYN_CTYPE_BOOL, "DoNirCmd", cCommand )
API de controle de volume do Windows
Enviado: 13 Ago 2023 02:15
por cjp
Muito obrigado a todos que responderam.
Resolvi provisoriamente a questão com a nircmd.
Mas ainda precisarei melhorar essa questão, pois, pelo que vi, a nircmd aumenta ou abaixa o volume, mas não verifica quanto está o volume.
Minha ideia seria apenas desmutar, se estiver no mudo, mas isso não achei lá.
De qualquer forma, já está ótimo.
Obrigado.
API de controle de volume do Windows
Enviado: 14 Ago 2023 13:09
por clodoaldomonteiro
Boa tarde.
Um cara q ajuda muito nesses problemas é o ChatGPT, veja a resposta dele:
Código: Selecionar todos
#include <stdio.h>
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
BOOL IsMuted() {
BOOL bMuted = FALSE;
CoInitialize(NULL);
IMMDeviceEnumerator *deviceEnumerator = NULL;
HRESULT hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (LPVOID *)&deviceEnumerator);
if (SUCCEEDED(hr)) {
IMMDevice *defaultDevice = NULL;
hr = deviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(deviceEnumerator, eRender, eConsole, &defaultDevice);
if (SUCCEEDED(hr)) {
IAudioEndpointVolume *endpointVolume = NULL;
hr = defaultDevice->lpVtbl->Activate(defaultDevice, &IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
if (SUCCEEDED(hr)) {
hr = endpointVolume->lpVtbl->GetMute(endpointVolume, &bMuted);
endpointVolume->lpVtbl->Release(endpointVolume);
}
defaultDevice->lpVtbl->Release(defaultDevice);
}
deviceEnumerator->lpVtbl->Release(deviceEnumerator);
}
CoUninitialize();
return bMuted;
}
int main() {
if (IsMuted()) {
printf("O volume do PC está mudo.\n");
} else {
printf("O volume do PC não está mudo.\n");
}
return 0;
}
int main() {
if (IsMuted()) {
printf("O volume do PC está mudo.\n");
} else {
printf("O volume do PC não está mudo.\n");
}
return 0;
}
Abraços.
API de controle de volume do Windows
Enviado: 16 Ago 2023 01:06
por cjp
Desculpe aí, não sabia que os códigos feitos pelo ChatGPT eram confiáveis.
Este código é em C++, correto?
Tentei colocar no meu sistema, com #pragma BEGINDUMP, não deu certo. Tá dando erro na compilação (imagem anexa). Fiz algo errado?
Também não sei bem como chamar programa em C++. Pode me ajudar?
API de controle de volume do Windows
Enviado: 17 Ago 2023 15:58
por clodoaldomonteiro
Para incluir rotinas em C, não é C++, no seu sistema, inicie com:
Código: Selecionar todos
#pragma BEGINDUMP
#include <"Includes arquivos em C">
HB_FUNC( NOME_SUA_FUNCAO )
{
//programação em C
return;
}
#pragma ENDDUMP
No Chat-GPT, pergunte o q quer e vá testando, se não der certo, vá refinando a pergunta.
Abraços.
API de controle de volume do Windows
Enviado: 18 Ago 2023 00:45
por cjp
Não sei se entendi bem.
Fiz assim:
Código: Selecionar todos
#pragma BEGINDUMP
#include <stdio.h>
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
hb_func("som")
BOOL IsMuted() {
BOOL bMuted = FALSE;
CoInitialize(NULL);
IMMDeviceEnumerator *deviceEnumerator = NULL;
HRESULT hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (LPVOID *)&deviceEnumerator);
if (SUCCEEDED(hr)) {
IMMDevice *defaultDevice = NULL;
hr = deviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(deviceEnumerator, eRender, eConsole, &defaultDevice);
if (SUCCEEDED(hr)) {
IAudioEndpointVolume *endpointVolume = NULL;
hr = defaultDevice->lpVtbl->Activate(defaultDevice, &IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
if (SUCCEEDED(hr)) {
hr = endpointVolume->lpVtbl->GetMute(endpointVolume, &bMuted);
endpointVolume->lpVtbl->Release(endpointVolume);
}
defaultDevice->lpVtbl->Release(defaultDevice);
}
deviceEnumerator->lpVtbl->Release(deviceEnumerator);
}
CoUninitialize();
return bMuted;
}
int som() {
if (IsMuted()) {
printf("O volume do PC está mudo.\n");
} else {
printf("O volume do PC não está mudo.\n");
}
return 0;
}
#pragma ENDDUMP
Deu erro na compilação (imagem anexa).
O que estou fazendo errado?
API de controle de volume do Windows
Enviado: 18 Ago 2023 02:28
por alxsts
Olá!
Use a busca do fórum... procure por hb_func. Vai encontrar vários exemplos. Compare a sintaxe do que encontrar com a sintaxe que você escreveu. Certamente encontrará diferenças. Corrija o teu código e compile...
API de controle de volume do Windows
Enviado: 18 Ago 2023 10:47
por cjp
Achei os seguintes tópicos (entre outros) no fórum:
viewtopic.php?f=4&t=27059&p=161240&hilit=hb_func#p161240
viewtopic.php?f=4&t=9619&p=161433&hilit=hb_func#p161433
Mudei assim:
Código: Selecionar todos
#pragma BEGINDUMP
#include <stdio.h>
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
hb_func(_som) {
BOOL IsMuted() {
BOOL bMuted = FALSE;
CoInitialize(NULL);
IMMDeviceEnumerator *deviceEnumerator = NULL;
HRESULT hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (LPVOID *)&deviceEnumerator);
if (SUCCEEDED(hr)) {
IMMDevice *defaultDevice = NULL;
hr = deviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(deviceEnumerator, eRender, eConsole, &defaultDevice);
if (SUCCEEDED(hr)) {
IAudioEndpointVolume *endpointVolume = NULL;
hr = defaultDevice->lpVtbl->Activate(defaultDevice, &IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
if (SUCCEEDED(hr)) {
hr = endpointVolume->lpVtbl->GetMute(endpointVolume, &bMuted);
endpointVolume->lpVtbl->Release(endpointVolume);
}
defaultDevice->lpVtbl->Release(defaultDevice);
}
deviceEnumerator->lpVtbl->Release(deviceEnumerator);
}
CoUninitialize();
return bMuted;
}
int _som() {
if (IsMuted()) {
printf("O volume do PC está mudo.\n");
} else {
printf("O volume do PC não está mudo.\n");
}
return 0;
}
}
#pragma ENDDUMP
Mas continua dando erro na compilação (vide anexo).
Testei também sem o "_" antes de "som", mas também não funcionou.
Ainda não consegui entender como fazer isto.
API de controle de volume do Windows
Enviado: 18 Ago 2023 21:33
por clodoaldomonteiro
Boa noite, Inacio.
Peguei esse exemplo com o GPT, que ele me passou na primeira questão, e geralmente vc vai ter q ir refinando a questão, informando as funções e erros q aconteceram, daí, pode ser, pode ser mesmo, que ele lhe dê uma respostas sem que vc tenha q fazer algum ajuste.
Não sou bom em C, e quando tenho alguma dúvida, saio pela internet pesquisando até me cansar, hehe.
A verdade é que nada vem fácil, só com muito estudo e persistência.
Abraços.
API de controle de volume do Windows
Enviado: 18 Ago 2023 21:58
por clodoaldomonteiro
Não testei em um PC, pois tenho um MacBook com Máquina Virtual.
Código: Selecionar todos
Function Main()
wait 'Pressione qq tecla para desligar o som.'
_VKPresTecla(0xAE)
wait 'Pressione qq tecla para ligar o som.'
_VKPresTecla(0xAD)
wait 'Terminou...'
Return
////////////////////////////////////////////////////////////////////////////////
//Funções em C
//https://learn.microsoft.com/pt-br/windows/win32/inputdev/virtual-key-codes
//https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
////////////////////////////////////////////////////////////////////////////////
#include "common.ch" // para poder redefinir a fun‡Æo type() para ischaracter() e outras
#include "winuser.ch"
/////////////////////////////////////////////////////////////////////////////
#pragma BEGINDUMP
#pragma comment( lib, "shell32.lib" )
#define _WIN32_WINNT 0x0400
#define HB_OS_WIN_32_USED
//Coloquei todos, pois nào lembro quais necessitam para Virtual Key
#include <windows.h> //arquivos C
#include <winsock.h>
#include <windows.h>
#include "winbase.h"
#include "winuser.h"
#include <stdio.h>
#include <stdlib.h>
#include <Iphlpapi.h>
#include <Assert.h>
#include "hbapi.h"
#include "hbapiitm.h"
#include "item.api"
#include <commdlg.h>
//#include <shlobj.h>
#include <commctrl.h>
/////////////////////////////////////////////////////////////////
//Pressionar qualquer tecla
HB_FUNC( _VKPRESTECLA )
{
keybd_event (hb_parnl(1), 0, 0, 0 ); //Pressiona a tecla
keybd_event (hb_parnl(1), 0, KEYEVENTF_KEYUP, 0); //Solta a tecla pressionada
}
#pragma ENDDUMP
Daí vc vai testando, modificando, pesquisando, e ando..., ando, hehe
Abraços
API de controle de volume do Windows
Enviado: 18 Ago 2023 22:30
por clodoaldomonteiro
Fiz uma consulta para o GPT novamente e retornou um que compilou, veja abaixo:
Código: Selecionar todos
#include <windows.h>
#include <mmsystem.h>
#include "hbapi.h"
HB_FUNC( ISMUTED )
{
DWORD dwVolume;
MMRESULT result = waveOutGetVolume(NULL, &dwVolume);
if (result == MMSYSERR_NOERROR)
{
if (LOWORD(dwVolume) == 0 && HIWORD(dwVolume) == 0)
hb_retl( HB_TRUE ); // Retorna verdadeiro
else
hb_retl( HB_FALSE ); // Retorna falso
}
else
{
hb_retl( HB_FALSE );
}
}
Compile o código usando o Harbour:
Copy code
harbour IsMuted.c -lwinmm
O argumento -lwinmm é usado para linkar com a biblioteca winmm.lib.
Depois de compilar, você terá o arquivo IsMuted.obj. Para finalizar, você precisa linkar este arquivo .obj ao seu programa Harbour principal.
Agora você pode chamar a função IsMuted() no seu código Harbour. Por exemplo:
harbour
Copy code
IF IsMuted()
? "O volume do PC esta mudo."
ELSE
? "O volume do PC nao esta mudo."
ENDIF
Espero que isso ajude! Se você encontrar algum problema, certifique-se de verificar todas as etapas e assegurar-se de que a biblioteca winmm.lib (ou mmsystem.lib) está acessível para o Harbour.
Té mais...
API de controle de volume do Windows
Enviado: 20 Ago 2023 00:13
por cjp
Funcionou. Muito obrigado.
Apenas para constar (pra eventuais outros interessados): no teu exemplo, está invertido, o de desligar, está ligando, o de ligar, está desligando o som.