Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Another option is use the WMI Events, on this case using the <code>__InstanceCreationEvent</code> Event and the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa394353%28v=vs.85%29.aspx" rel="noreferrer"><code>Win32_PnPEntity</code></a> WMI class you can filter the serial ports added using the <a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff553426%28v=vs.85%29.aspx" rel="noreferrer"><code>{4d36e978-e325-11ce-bfc1-08002be10318}</code></a> class GUID, writting a WQL sentence like so </p> <pre><code>Select * From __InstanceCreationEvent Within 1 Where TargetInstance ISA "Win32_PnPEntity" AND TargetInstance.ClassGuid="{4d36e978-e325-11ce-bfc1-08002be10318}" </code></pre> <p>Try this sample</p> <pre><code>{$APPTYPE CONSOLE} {$R *.res} uses Windows, {$IF CompilerVersion &gt; 18.5} Forms, {$IFEND} SysUtils, ActiveX, ComObj, WbemScripting_TLB; type TWmiAsyncEvent = class private FWQL : string; FSink : TSWbemSink; FLocator : ISWbemLocator; FServices : ISWbemServices; procedure EventReceived(ASender: TObject; const objWbemObject: ISWbemObject; const objWbemAsyncContext: ISWbemNamedValueSet); public procedure Start; constructor Create; Destructor Destroy;override; end; //Detect when a key was pressed in the console window function KeyPressed:Boolean; var lpNumberOfEvents : DWORD; lpBuffer : TInputRecord; lpNumberOfEventsRead : DWORD; nStdHandle : THandle; begin Result:=false; nStdHandle := GetStdHandle(STD_INPUT_HANDLE); lpNumberOfEvents:=0; GetNumberOfConsoleInputEvents(nStdHandle,lpNumberOfEvents); if lpNumberOfEvents&lt;&gt; 0 then begin PeekConsoleInput(nStdHandle,lpBuffer,1,lpNumberOfEventsRead); if lpNumberOfEventsRead &lt;&gt; 0 then begin if lpBuffer.EventType = KEY_EVENT then begin if lpBuffer.Event.KeyEvent.bKeyDown then Result:=true else FlushConsoleInputBuffer(nStdHandle); end else FlushConsoleInputBuffer(nStdHandle); end; end; end; { TWmiAsyncEvent } constructor TWmiAsyncEvent.Create; const strServer ='.'; strNamespace ='root\CIMV2'; strUser =''; strPassword =''; begin inherited Create; CoInitializeEx(nil, COINIT_MULTITHREADED); FLocator := CoSWbemLocator.Create; FServices := FLocator.ConnectServer(strServer, strNamespace, strUser, strPassword, '', '', wbemConnectFlagUseMaxWait, nil); FSink := TSWbemSink.Create(nil); FSink.OnObjectReady := EventReceived; FWQL:='Select * From __InstanceCreationEvent Within 1 '+ 'Where TargetInstance ISA "Win32_PnPEntity" AND TargetInstance.ClassGuid="{4d36e978-e325-11ce-bfc1-08002be10318}" '; end; destructor TWmiAsyncEvent.Destroy; begin if FSink&lt;&gt;nil then FSink.Cancel; FLocator :=nil; FServices :=nil; FSink :=nil; CoUninitialize; inherited; end; procedure TWmiAsyncEvent.EventReceived(ASender: TObject; const objWbemObject: ISWbemObject; const objWbemAsyncContext: ISWbemNamedValueSet); var PropVal: OLEVariant; begin PropVal := objWbemObject; Writeln(Format('TargetInstance.ClassGuid : %s ',[String(PropVal.TargetInstance.ClassGuid)])); Writeln(Format('TargetInstance.Description : %s ',[String(PropVal.TargetInstance.Description)])); Writeln(Format('TargetInstance.Name : %s ',[String(PropVal.TargetInstance.Name)])); Writeln(Format('TargetInstance.PNPDeviceID : %s ',[String(PropVal.TargetInstance.PNPDeviceID)])); Writeln(Format('TargetInstance.Status : %s ',[String(PropVal.TargetInstance.Status)])); end; procedure TWmiAsyncEvent.Start; begin Writeln('Listening events...Press Any key to exit'); FServices.ExecNotificationQueryAsync(FSink.DefaultInterface,FWQL,'WQL', 0, nil, nil); end; var AsyncEvent : TWmiAsyncEvent; begin try AsyncEvent:=TWmiAsyncEvent.Create; try AsyncEvent.Start; //The next loop is only necessary in this sample console sample app //In VCL forms Apps you don't need use a loop while not KeyPressed do begin {$IF CompilerVersion &gt; 18.5} Sleep(100); Application.ProcessMessages; {$IFEND} end; finally AsyncEvent.Free; end; except on E:EOleException do Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Writeln(E.Classname, ':', E.Message); end; end. </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload