Api 如何制作程序来更新即插即用设备(Windows 8)
。。。如转到设备管理器,右键单击并更新 我试着在delphi上做程序,就像这样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);
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程序会更好吗?这段代码实现你期望的功能的文档在哪里?我以为系统会广播这些消息。我不明白你为什么相信你可以这么做。不要无缘无故地尝试随机代码。你需要找到一些文档。更重要的是,为什么你的程序会这样做需要这样做吗?对我来说,这似乎是解决您实际面临的任何问题的错误解决方案。感谢您的代码。我根据它制作了程序。但是设备没有更新:(可能我犯了一些错误。再次感谢您的代码