Api 如何制作程序来更新即插即用设备(Windows 8)

Api 如何制作程序来更新即插即用设备(Windows 8),api,delphi,Api,Delphi,。。。如转到设备管理器,右键单击并更新 我试着在delphi上做程序,就像这样 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,mmsystem; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject);

。。。如转到设备管理器,右键单击并更新

我试着在delphi上做程序,就像这样

unit Unit1;

interface

uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls,mmsystem;

type  
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);   
    private
    public
    end;

var   Form1: TForm1;

implementation

{$R *.dfm} const  DBT_CONFIGCHANGED = $0018;

procedure TForm1.FormCreate(Sender: TObject); begin
  SendMessage(HWND_BROADCAST, WM_DEVICECHANGE, DBT_CONFIGCHANGED, 0);
end;
但是它不起作用。

根据Microsoft的文章,您可以使用以下代码强制从应用程序重新计算设备树:

const
  CM_LOCATE_DEVNODE_NORMAL = 0;
  CR_SUCCESS = 0;

type
  DEVINST = LongWord;
  CONFIGRET = LongWord;
  ULONG = LongWord;

function CM_Locate_DevNode(var dnDevInst: DEVINST; pDeviceID: Pointer; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Locate_DevNodeA';
function CM_Reenumerate_DevNode(var dnDevInst: DEVINST; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Reenumerate_DevNode';

function ScanForHardwareChanges(): Boolean;
var
  dev: DEVINST;
  retval: CONFIGRET;
begin
  // Get the root devnode.
  retval := CM_Locate_DevNode(dev, nil, CM_LOCATE_DEVNODE_NORMAL);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Locate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  retval := CM_Reenumerate_DevNode(dev, 0);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Reenumerate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  Result := True;
end;
const
CM_LOCATE_DEVNODE_NORMAL=0;
成功率=0;
类型
DEVINST=长单词;
CONFIGRET=LongWord;
ULONG=长词;
函数CM_Locate_DevNode(变量dnDevInst:DEVINST;pDeviceID:Pointer;ulFlags:ULONG):CONFIGRET;stdcall;外部'cfgmgr32.dll'名称'CM_Locate_DevNodeA';
函数CM_renumerate_DevNode(变量dnDevInst:DEVINST;ulFlags:ULONG):CONFIGRET;stdcall;外部'cfgmgr32.dll'名称'CM_Reenumerate_DevNode';
函数ScanForHardwareChanges():布尔值;
变量
dev:DEVINST;
retval:CONFIGRET;
开始
//获取根devnode。
retval:=CM_Locate_DevNode(dev,nil,CM_Locate_DevNode_NORMAL);
如果(返回CR_成功),则
开始
//Writeln('CM\u Locate\u DevNode failed:',status);
结果:=假;
出口
结束;
retval:=CM\u重新计算\u DevNode(dev,0);
如果(返回CR_成功),则
开始
//Writeln('CM_renumerate_DevNode failed:',状态);
结果:=假;
出口
结束;
结果:=真;
结束;

谢谢您的代码。我根据它制作了一个程序

`unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mmsystem;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
const
  CM_LOCATE_DEVNODE_NORMAL = 0;
  CR_SUCCESS = 0;

type
  DEVINST = LongWord;
  CONFIGRET = LongWord;
  ULONG = LongWord;

function CM_Locate_DevNode(var dnDevInst: DEVINST; pDeviceID: Pointer; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Locate_DevNodeA';
function CM_Reenumerate_DevNode(var dnDevInst: DEVINST; ulFlags: ULONG): CONFIGRET; stdcall; external 'cfgmgr32.dll' name 'CM_Reenumerate_DevNode';
procedure TForm1.Button1Click(Sender: TObject);

function ScanForHardwareChanges(): Boolean;
var
  dev: DEVINST;
  retval: CONFIGRET;
begin

begin
  // Get the root devnode.
  retval := CM_Locate_DevNode(dev, nil, CM_LOCATE_DEVNODE_NORMAL);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Locate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  retval := CM_Reenumerate_DevNode(dev, 0);

  if (retval <> CR_SUCCESS) then
  begin
    // Writeln('CM_Reenumerate_DevNode failed: ', status);
    Result := False;
    Exit;
  end;

  Result := True;
end;
end;
BEGIN
END;

end.`
单元1; 接口 使用 窗口、消息、系统工具、变体、类、图形、控件、窗体、, 对话框、机顶盒、彩信系统; 类型 TForm1=类(TForm) 按钮1:t按钮; 程序按钮1点击(发送方:ToObject); 私有的 {私有声明} 公众的 {公开声明} 结束; 变量 表1:TForm1; 实施 {$R*.dfm} 常数 CM_LOCATE_DEVNODE_NORMAL=0; 成功率=0; 类型 DEVINST=长单词; CONFIGRET=LongWord; ULONG=长词; 函数CM_Locate_DevNode(变量dnDevInst:DEVINST;pDeviceID:Pointer;ulFlags:ULONG):CONFIGRET;stdcall;外部'cfgmgr32.dll'名称'CM_Locate_DevNodeA'; 函数CM_renumerate_DevNode(变量dnDevInst:DEVINST;ulFlags:ULONG):CONFIGRET;stdcall;外部'cfgmgr32.dll'名称'CM_Reenumerate_DevNode'; 程序TForm1.按钮1单击(发送方:TObject); 函数ScanForHardwareChanges():布尔值; 变量 dev:DEVINST; retval:CONFIGRET; 开始 开始 //获取根devnode。 retval:=CM_Locate_DevNode(dev,nil,CM_Locate_DevNode_NORMAL); 如果(返回CR_成功),则 开始 //Writeln('CM\u Locate\u DevNode failed:',status); 结果:=假; 出口 结束; retval:=CM\u重新计算\u DevNode(dev,0); 如果(返回CR_成功),则 开始 //Writeln('CM_renumerate_DevNode failed:',状态); 结果:=假; 出口 结束; 结果:=真; 结束; 结束; 开始 结束; 结束`

但是设备没有更新:(可能是我犯了一些错误。再次感谢你的代码。

不是Delphi,但如果你说发生了什么,而不是简单地说它不起作用,这可能会帮助你更容易得到一个好的答案。它是否抛出了一个错误(错误是什么),让你的电脑爆炸,把火星变成黑洞,还有其他什么?看。当我启动这个程序时,什么都没有改变,我只听到一些设备被移除的声音。设备不是更新。所有的问题是,在srart之后,我的windows看不到我的笔记本电脑电池,当我在divece manager中更新我的设备时,我的电池就站起来了nd.如果我在这里分享我的delhpi程序会更好吗?这段代码实现你期望的功能的文档在哪里?我以为系统会广播这些消息。我不明白你为什么相信你可以这么做。不要无缘无故地尝试随机代码。你需要找到一些文档。更重要的是,为什么你的程序会这样做需要这样做吗?对我来说,这似乎是解决您实际面临的任何问题的错误解决方案。感谢您的代码。我根据它制作了程序。但是设备没有更新:(可能我犯了一些错误。再次感谢您的代码