gpt4 book ai didi

windows - 阻止 WM_DEVICECHANGE 调度

转载 作者:可可西里 更新时间:2023-11-01 10:07:49 30 4
gpt4 key购买 nike

我正在开发一个 Windows 7 应用程序,它必须防止 WinDVD 在插入时触发新光盘可用性(即插入 DVD)。

背景信息:

我正在为一家公司开发这个小应用程序,该公司必须同时比较两个电影播放器​​同时播放来自不同驱动器的同一张 DVD。

他们正在进行启发式质量测试,以确定目前最好的 DVD 播放器,并将其捆绑到他们的新 PC 系列中。

目前他们最好的选择似乎是 WinDVD,因此所有其他测试都必须针对它进行。问题是,当他们插入第一张 DVD 时,默认播放器 WinDVD 启动就没问题了。

然后当他们插入第二张光盘时,默认播放器首先响应,因此他们被迫关闭窗口并打开他们正在测试的另一个播放器。

这是为许多电影完成的,这些电影代表了对它们的专色渲染和图像质量的引用。用户在附加窗口出现时关闭它变得很乏味,因为该操作每周要重复数百次。

我的程序试图禁止默认播放器的第二次响应

我想拦截 WM_DEVICECHANGE 消息,以某种方式为它创建一个全局 Hook 。

问题是,拦截 WM_DEVICECHANGE 效果很好,但它不会阻止 WinDVD 触发新单元插入的能力,显然无论如何都会让消息被传送。因此,我开始考虑如何防止在我拦截后发送该消息。

为了实现我想到的这个全局钩子(Hook),我使用了这行代码:

CurrentHook:=setwindowshookex(WH_CALLWNDPROC,HookProcAdd,LibHandle,0);

链接到包含在我的 DLL 中的回调,我可以看到 WM_DEVICECHANGE 被正确拦截,但正如我所说,该消息仍被分发到整个系统。

任何建议表示赞赏。

更新:

@TOndrej :我尝试了以下内容:

var
rlen : DWORD;
pRelen : ^DWORD;
h : THandle;
val : Boolean;
pVal: ^Boolean;
res : Boolean;
begin
rlen := 0;
val := True;
pVal := @val;
pRelen := @val;
h := CreateFile(PChar('\\.\d:'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0);
if h <> INVALID_HANDLE_VALUE then
begin
res:= DeviceIoControl(h,
IOCTL_STORAGE_MCN_CONTROL,
pVal,
SizeOf(val),
nil,
0,
rlen,
nil);
if not res then
begin

ShowMessage('Error');
end;

CloseHandle(h);
end;
end;

但是res每次都是false。我错过了什么?

最佳答案

对于 IOCTL_STORAGE_MCN_CONTROL 控制代码,必须使用 FILE_READ_ATTRIBUTES 访问权限打开文件:

var
rlen: DWORD;
pVal: PBOOL;
res: BOOL;
begin
rlen := 0;

GetMem(PVal,SizeOf(BOOL));
pVal^ := TRUE;


h := CreateFile(PChar('\\.\D:'),
FILE_READ_ATTRIBUTES,
FILE_SHARE_READ OR FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);

if h <> INVALID_HANDLE_VALUE then
begin
res:= DeviceIoControl(h,
IOCTL_STORAGE_MCN_CONTROL,
pVal,
SizeOf(BOOL),
nil,
0,
rlen,
nil);
if not res then
begin
ShowMessage('Error');
end else
begin
ShowMessage('Device Notification Disabled');
end;

// close file handle
CloseHandle(h);
// After CloseHandle, file notification is restored...
end;
end;

在我的测试中,CloseHandle 后,设备通知恢复...

关于windows - 阻止 WM_DEVICECHANGE 调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11717826/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com