测试步骤:
1、启动任务管理器,点击“应用程序”选项卡
2、启动测试程序,点击按钮 Button1 以模拟点击任务管理器的按钮“新任务”问题:
为什么模拟点击在有效和无效间切换,即这次有效,下次就无效?
还有,如果在最小化任务管理器的情况下测试,为什么每次都有效?procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWND;
begin
  h := FindWindow('#32770', 'Windows 任务管理器');
  h := FindWindowEx(h, 0, '#32770', nil);
  h := FindWindowEx(h, 0, 'Button', '新任务(&N)...');
  SendMessage(h, WM_LBUTTONDOWN, MK_LBUTTON, 0);
  SendMessage(h, WM_LBUTTONUP, 0, 0);
end;

解决方案 »

  1.   

    个人感觉和焦点有点关系,你可以把Taskmgr最小化然后试试
    原因我还没有找到!
      

  2.   

    最后参数要给鼠标的坐标,而你给的是0,估计是这里的问题。
    模拟按钮事件最好是给其父窗口发WM_COMMAND、BN_CLICKED消息,模拟鼠标消息很多时候不起作用。
      

  3.   

    这鼠标坐标是相对于按钮区域左上角的,没有问题——试验过了,把 0 改成了 MAKELONG(5, 5),结果还是不行。
    至于发送 WM_COMMAND,我用下面的语句任务管理器貌似没有任何反应,而对程序自己的按钮的模拟点击是可以的。
    PostMessage(h, WM_COMMAND, MAKELONG(GetDlgCtrlID(h), BN_CLICKED), h);
      

  4.   

    WM_COMMAND要发给按钮的父窗口,最好用SendMessage来发。
      

  5.   

    谢谢,搞定!发送 WM_COMMAND 是正解!这个估计恒有用!
    procedure TForm1.Button1Click(Sender: TObject);
    var
      h, hParent: HWND;
    begin
      h := FindWindow('#32770', 'Windows 任务管理器');
      hParent := FindWindowEx(h, 0, '#32770', nil);
      h := FindWindowEx(hParent, 0, 'Button', '新任务(&N)...');
      
      {模拟点击按钮的三种方法(还有其他方法如使用 mouse_event, keybd_event 等)}
      //1
      SendMessage(hParent, WM_COMMAND, MAKELONG(GetDlgCtrlID(h), BN_CLICKED), h);
      //2
      //SendMessage(h, BM_CLICK, 0, 0);
      //3
      //SendMessage(h, WM_LBUTTONDOWN, MK_LBUTTON, 0);
      //SendMessage(h, WM_LBUTTONUP, 0, 0);
    end;