需要通过sendmessage来模拟点另一窗体(另一进程)需要鼠标键盘同时操作,例如按shift多选,已取得操作控件的hwnd

解决方案 »

  1.   

    //参考如下代码
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vKeyState: TKeyboardState;
      vShiftState: Byte;
    begin
      SendMessage(ListBox1.Handle, WM_LBUTTONDOWN, 0, MakeLong(0, 2));
      SendMessage(ListBox1.Handle, WM_LBUTTONUP, 0, MakeLong(0, 2));
      GetKeyboardState(vKeyState);
      vShiftState := vKeyState[VK_SHIFT]; // 记忆
      vKeyState[VK_SHIFT] := $80;
      SetKeyboardState(vKeyState);
      SendMessage(ListBox1.Handle, WM_LBUTTONDOWN, 0, MakeLong(0, 32));
      SendMessage(ListBox1.Handle, WM_LBUTTONUP, 0, MakeLong(0, 32));
      vKeyState[VK_SHIFT] := vShiftState; // 恢复
      SetKeyboardState(vKeyState);
    end;
      

  2.   

    //再参考如下代码
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendMessage(Handle, WM_LBUTTONDOWN, MK_SHIFT, MakeLong(0, 2));
      SendMessage(Handle, WM_LBUTTONUP, MK_SHIFT, MakeLong(0, 2));
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if ssShift in Shift then ShowMessage('shift');
    end;