procedure TForm1.Button1Click(Sender: TObject);
var
  KeyState: TKeyboardState;
begin
  KEYBD_EVENT(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), 0, 0);
  KEYBD_EVENT(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), KEYEVENTF_KEYUP, 0);
  
  //检测为什么正好相反?如果放到另一个事件比如button2Click中就正确?大家帮忙看看
  GetKeyboardState(KeyState);
  if KeyState[VK_CAPITAL] <> 0 then
    Caption := '大写开'
  else
    Caption := '大写关';
end;