1..怎么获得硬盘的id,cpu的id????2..像豪杰超级解霸那样的菜单怎么做的???
   比如点他的:"文件"这弹出的下拉菜单的左边有竖着排列着:"豪杰超级解霸"的图片啊,怎么做的???

解决方案 »

  1.   

    1,CSDN和Google上已经有N个回复了
    2,使用第三方的Menu组件应该可以的,网上找
      

  2.   

    通过端口获取IDE硬盘ID 
    char *GetAscii(unsigned int inData[], int offStart, int offEnd);
    int main(void)
    {
       unsigned int   diskData[256];    /* Disk data                  */
       unsigned int   offset;           /* Disk data offset           */
       int            loop;
       int            numDrv;           /* Number of IDE hard drives  */
       union REGS     registers;
       unsigned int   biosCyl[2];       /* Cylinders, Heads, Sectors */
       unsigned int   biosHead[2];
       unsigned int   biosSec [2];
       numDrv = peekb(0x40, 0x75);      /* BIOS Data area, Number of Hard disks */
       for (loop = 0; loop < numDrv; loop++)
       {
          while (inp(0x01f7) != 0x50);  /* Wait for controller not busy         */
          outp(0x01f6, (loop == 0 ? 0xa0 : 0xb0));  /* Get first/second drive   */
          outp(0x01f7, 0xec);                       /* Get drive info data      */
          while (inp(0x1f7) != 0x58);   /* Wait for data ready                  */
          for (offset = 0; offset != 256; offset++) /* Read "sector"            */
             diskData[offset] = inpw(0x1f0);
          /* Get BIOS drive info */
          registers.h.ah = 0x08;        /* Get drive info                          */
          registers.h.dl = 0x80 + loop; /* Drive is 80H for Disk 0, 81H for Disk 1 */
          int86(0x13, ?isters, ?isters);
          if (!registers.x.cflag)       /* All OK if carry not set */
          {
             biosHead[loop] = registers.h.dh + 1;      /* Heads are from 0 */
             biosSec[loop]  = registers.h.cl & 0x3f;   /* sec is bits 5 - 0 */
             /* +1 because starts from 0 and +1 for FDISK leaving one out */
             biosCyl[loop]  = ((registers.h.cl & 0xc0) << 2) + registers.h.ch + 2;
          } /* end of if */
          printf("DRIVE %d:\n", loop);
          printf("Model Number______________________: %s\n", GetAscii(diskData, 27, 46));
          printf("Serial Number_____________________: %s\n", GetAscii(diskData, 10, 19));
          printf("Controller Revision Number________: %s\n\n", GetAscii(diskData, 23, 26));
          printf("Able to do Double Word Transfer___: %6s\n", (diskData[48] == 0 ? "No" : "Yes"));
          printf("Controller type___________________:   %04X\n", diskData[20]);
          printf("Controller buffer size (bytes)____: %6u\n", diskData[21] * 512);
          printf("Number of ECC bytes transferred___: %6u\n", diskData[22]);
          printf("Number of sectors per interrupt___: %6u\n\n", diskData[47]);
          printf("Hard Disk Reports\n");
          printf("Number of Cylinders (Fixed)_______: %6u\n", diskData[1]);
          printf("Number of Heads___________________: %6u\n", diskData[3]);
          printf("Number of Sectors per Track_______: %6u\n\n", diskData[6]);
          printf("BIOS Reports\n");
          printf("Number of Cylinders_______________: %6u\n", biosCyl[loop]);
          printf("Number of Heads___________________: %6u\n", biosHead[loop]);
          printf("Number of Sectors per Track_______: %6u\n\n", biosSec[loop]);
          printf("Press any key to continue...\n\n");
          getch();
       } /* end of for */
       return 0;
    } /* main() */
    char *GetAscii(unsigned int inData[], int offStart, int offEnd)
    {
       static char retVal[255];
       int         loop, loop1;
       for (loop = offStart, loop1 = 0; loop <= offEnd; loop++)
       {
          retVal[loop1++] = (char )(inData[loop] / 256);  /* Get High byte */
          retVal[loop1++] = (char )(inData[loop] % 256);  /* Get Low byte  */
       } /* end of for */
       retVal[loop1] = '\0';    /* Make sure it ends in a NULL character */
       return retVal;
    } /* GetAscii() */ 
    CPU ID
    //转 unit Main;interfaceuses
      Windows,
      Messages,
      SysUtils,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      ExtCtrls,
      StdCtrls,
      Buttons;type
      TDemoForm = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        GetButton: TBitBtn;
        CloseButton: TBitBtn;
        Bevel1: TBevel;
        Label5: TLabel;
        FLabel: TLabel;
        MLabel: TLabel;
        PLabel: TLabel;
        SLabel: TLabel;
        PValue: TLabel;
        FValue: TLabel;
        MValue: TLabel;
        SValue: TLabel;
        procedure GetButtonClick(Sender: TObject);
      end;var
      DemoForm: TDemoForm;implementation{$R *.DFM}const
     ID_BIT = $200000;   // EFLAGS ID bit
    type
     TCPUID = array[1..4] of Longint;
     TVendor = array [0..11] of char;function IsCPUID_Available : Boolean; register;
    asm
     PUSHFD       {direct access to flags no possible, only via stack}
      POP     EAX     {flags to EAX}
      MOV     EDX,EAX   {save current flags}
      XOR     EAX,ID_BIT {not ID bit}
      PUSH    EAX     {onto stack}
      POPFD        {from stack to flags, with not ID bit}
      PUSHFD       {back to stack}
      POP     EAX     {get back to EAX}
      XOR     EAX,EDX   {check if ID bit affected}
      JZ      @exit    {no, CPUID not availavle}
      MOV     AL,True   {Result=True}
    @exit:
    end;function GetCPUID : TCPUID; assembler; register;
    asm
      PUSH    EBX         {Save affected register}
      PUSH    EDI
      MOV     EDI,EAX     {@Resukt}
      MOV     EAX,1
      DW      $A20F       {CPUID Command}
      STOSD             {CPUID[1]}
      MOV     EAX,EBX
      STOSD               {CPUID[2]}
      MOV     EAX,ECX
      STOSD               {CPUID[3]}
      MOV     EAX,EDX
      STOSD               {CPUID[4]}
      POP     EDI     {Restore registers}
      POP     EBX
    end;function GetCPUVendor : TVendor; assembler; register;
    asm
      PUSH    EBX     {Save affected register}
      PUSH    EDI
      MOV     EDI,EAX   {@Result (TVendor)}
      MOV     EAX,0
      DW      $A20F    {CPUID Command}
      MOV     EAX,EBX
      XCHG  EBX,ECX     {save ECX result}
      MOV   ECX,4
    @1:
      STOSB
      SHR     EAX,8
      LOOP    @1
      MOV     EAX,EDX
      MOV   ECX,4
    @2:
      STOSB
      SHR     EAX,8
      LOOP    @2
      MOV     EAX,EBX
      MOV   ECX,4
    @3:
      STOSB
      SHR     EAX,8
      LOOP    @3
      POP     EDI     {Restore registers}
      POP     EBX
    end;procedure TDemoForm.GetButtonClick(Sender: TObject);
    var
      CPUID : TCPUID;
      I     : Integer;
      S   : TVendor;
    begin
     for I := Low(CPUID) to High(CPUID)  do CPUID[I] := -1;
      if IsCPUID_Available then begin
       CPUID := GetCPUID;
       Label1.Caption := 'CPUID[1] = ' + IntToHex(CPUID[1],8);
       Label2.Caption := 'CPUID[2] = ' + IntToHex(CPUID[2],8);
       Label3.Caption := 'CPUID[3] = ' + IntToHex(CPUID[3],8);
       Label4.Caption := 'CPUID[4] = ' + IntToHex(CPUID[4],8);
       PValue.Caption := IntToStr(CPUID[1] shr 12 and 3);
       FValue.Caption := IntToStr(CPUID[1] shr 8 and $f);
       MValue.Caption := IntToStr(CPUID[1] shr 4 and $f);
       SValue.Caption := IntToStr(CPUID[1] and $f);
       S := GetCPUVendor;
       Label5.Caption := 'Vendor: ' + S; end
      else begin
       Label5.Caption := 'CPUID not available';
      end;
    end;end.
    2的话可以自己做一个框,然后替代标准的弹出框