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

背景信息:

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

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

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

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

对于许多电影来说,都是这样做的,这些电影代表了对它们的引用,以实现彩色渲染和图像质量。当附加窗口出现时,用户关闭附加窗口将变得很麻烦,因为该操作每周应重复数百次。

我的程序试图禁止默认玩家的第二 react

我想拦截一个WM_DEVICECHANGE消息,以某种方式为其创建一个全局钩子(Hook)。

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

为了实现我想到的这个全局挂钩,我正在使用以下代码行:

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每次都是假的。我想念什么?

最佳答案

对于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/

10-12 12:17