我对控制面板里的设置是不是都写在注册表里了?

xt_jat 2005-05-23 09:57:17
我想得到控制面板里的 声音与多媒体里的 midi首选设备 有什么方法吗?
...全文
86 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2005-05-25
或者再试试WMI
它的Win32_SoundDevice 是否有你要的
(我只有一个Sound设备,无法测试)
class Win32_SoundDevice : CIM_LogicalDevice
{
uint16 Availability;
string Caption;
uint32 ConfigManagerErrorCode;
boolean ConfigManagerUserConfig;
string CreationClassName;
string Description;
string DeviceID;
uint16 DMABufferSize;
boolean ErrorCleared;
string ErrorDescription;
datetime InstallDate;
uint32 LastErrorCode;
string Manufacturer;
uint32 MPU401Address;
string Name;
string PNPDeviceID;
uint16 PowerManagementCapabilities[];
boolean PowerManagementSupported;
string ProductName;
string Status;
uint16 StatusInfo;
string SystemCreationClassName;
string SystemName;
};
回复
可以考虑使用mci系列API,
MCI Functions
The following functions are used with MCI.

mciGetCreatorTask
mciGetDeviceID
mciGetErrorString
mciGetYieldProc
mciSendCommand
mciSendString
mciSetYieldProc

回复
vcmute 2005-05-25
ControlSet001改CurrentControlSet,如

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MediaResources\MIDI
回复
vcmute 2005-05-25
对应的wdmaud.drv<0018>,wdmaud.drv<0019>的显示名称,察看
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\MediaResources\MIDI\wdmaud.drv<0018>\FriendlyName

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\MediaResources\MIDI\wdmaud.drv<0019>\FriendlyName
回复
xt_jat 2005-05-25
问题还没有解决,痛苦

我试了注册表的这个值, 通常情况下可以读出来, 可是如果用户从未在控制面板里设过这个值,那在注册表中就没有这一项。这时我就不知道该到哪去读这个值了
回复
luolovegui 2005-05-24
好多星星啊,我想我没有说的份了,帮你顶
回复
柯本 2005-05-24
看看这里:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96C-E325-11CE-BFC1-08002BE10318}
回复
xt_jat 2005-05-24
我用 RegSnap 试了试 它的值放在了这里

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap\CurrentInstrument
“wdmaud.drv<0018>"
"wdmaud.drv<0019>"

但我没看明白 这个值与对话框里显示的字符串是如何对应起来的

回复
柯本 2005-05-24
1.把::ShowWindow(wd,SW_HIDE);去掉即可,我特地加的,不显示
回复
vcmute 2005-05-24
1。 有对话框一闪而过
可以把SW_SHOW改为SW_HIDE
回复
xt_jat 2005-05-24
keiy() 谢谢你

我试过你的方法,确实可以得到

但这种用法有几个问题 

1。 有对话框一闪而过
2。 对多语言版本窗口名字不太好找
不知是否有更为简单的方法
回复
柯本 2005-05-24
我的方法(我常用的FindWindow/SendMessage):
void CVctestDlg::OnButton10()
{
// TODO: Add your control notification handler code here
UINT k=WinExec("rundll32.exe shell32.dll,Control_RunDLL \"E:\\WINNT\\system32\\MMSYS.CPL\",@0",SW_SHOW);
if(k<32)
{
CString x;
x.Format("%d",k);
MessageBox(x); // 要在error后返回,下同
}
HWND wd=::FindWindow(NULL,"声音和多媒体 属性");
if (wd==NULL)
MessageBox("Error1");
::ShowWindow(wd,SW_HIDE);

HWND wtd=FindWindowEx(wd,NULL,"SysTabControl32",NULL);
if (wtd==NULL)
MessageBox("Error2");

TabCtrl_SetCurFocus(wtd,1);

HWND wd1=FindWindowEx(wd,NULL,NULL,"音频");
if (wd1==NULL)
MessageBox("Error3");

HWND cb1=FindWindowEx(wd1,NULL,"ComboBox",NULL);
if (cb1==NULL)
MessageBox("Error4");
CComboBox cm;
cm.Attach(cb1);
char buff[256];
cm.GetLBText(cm.GetCurSel(), buff );
cm.Detach();

HWND bb1=FindWindowEx(wd,NULL,NULL,"取消");
if (bb1==NULL)
MessageBox("Error6");
int id=::GetDlgCtrlID(bb1);
::SendMessage(wd,WM_COMMAND, MAKELONG(id,BN_CLICKED),(long)bb1);
MessageBox(buff); //显示结果
}
回复
auly403 2005-05-24
既然没人知道...找个有这个方面功能的安装软件,
就用RegSnap来监视,就清楚怎么搞了.
回复
lj1006 2005-05-24
关注,帮你UP
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告