代码如下,蓝色部分代码运作正常,红色部分编译没出任何问题,但是就是找到生成窗体hwnd后(通过spy++查看没出错),用SendMessage对该窗体发送消息没任何反应。求求斑竹和各路高手解决,分不多,希望有人能拿下
    //*************************给runas启用管理员的cmd**************************
    WinExec('runas /user:administrator cmd',SW_HIDE);
    h:=FindWindow('ConsoleWindowClass','C:\Windows\system32\runas.exe');
    Delay(100);
    while h=0 do
    begin
         h:=FindWindow('ConsoleWindowClass','C:\Windows\system32\runas.exe');
    end;
    SendMessageToCMD(h,mystring);//mystring是密码
    postmessage(h,WM_keydown,13,0);
    Delay(100);
    SendMessage(h,WM_CLOSE,0,0);//关闭隐藏的CMD窗口 }
    //close;

    //*************************给runas启用管理员的cmd**************************
    h:=FindWindow('ConsoleWindowClass','管理员: cmd (作为 XX-PC\administrator 运行)');
    while h=0 do
    begin
        h:=FindWindow('ConsoleWindowClass','管理员: cmd (作为 XX-PC\administrator 运行)');
    end;
    Delay(100);
    mystring:=mypath;
    SendMessageToCMD(h,mystring);
    postmessage(h,WM_keydown,13,0);
    SendMessage(h,WM_CLOSE,0,0);//关闭隐藏的CMD窗口 }
delphiwindows

解决方案 »

  1.   

    贴代码居然不能改颜色,上文说红色部分就是 //*************************给runas启用管理员的cmd**************************
        WinExec('runas /user:administrator cmd',SW_HIDE);
        h:=FindWindow('ConsoleWindowClass','C:\Windows\system32\runas.exe');
        Delay(100);
        while h=0 do
        begin
             h:=FindWindow('ConsoleWindowClass','C:\Windows\system32\runas.exe');
        end;
        SendMessageToCMD(h,mystring);
        postmessage(h,WM_keydown,13,0);
        Delay(100);
        SendMessage(h,WM_CLOSE,0,0);//关闭隐藏的CMD窗口 }
        //close;
        //*************************给runas启用管理员的cmd**************************
      

  2.   

    昨天我程序怎么都不能操作新建的cmd窗口,今天试试了,突然可以了。估计不是你说的原因
      

  3.   

    我不知道,昨天不承认,今天又突然可以了,不清楚是不是重启一下系统才可以,不知道什么原因。顺便请教下斑竹,下面的是我发送消息到cmd窗口的,新电脑运行下面代码的话,不知道是否系统太快了,运行下面代码无效的(旧电脑倒可以实现),请问可以用什么方法改进除了加delayprocedure TForm1.SendMessageToCMD(hwd:hwnd ;str:string);
    var
        i:integer;
        ch: byte;
    begin
        i := 1;
        while i <= Length(str) do
         //该过程发送指定字符串(中英文皆可以)
        begin
            Delay(500);
            ch := byte(str[ i ]);
            if Windows.IsDBCSLeadByte(ch) then
            begin
              Inc(i);
              SendMessage(hwd, WM_IME_CHAR, MakeWord(byte(str[ i ]), ch), 0);
            end
            else
            begin
              SendMessage(hwd, WM_IME_CHAR, word(ch), 0);
            end;
            Inc(i);
        end;
    end;
      

  4.   


    我不知道有这个东西呢,请教下,上面的代码能否不用timer这类的东西实现,
    上面的代码我估计就是机器有些机器太快了,我sendmessage完以后cmd还么反应过来
    我不知道怎么结局呢
      

  5.   


    求人还不如求己,找到原因了:自从vista之后就windows里面就加入了很多的安全特性.其中听得最多的就是UAC.还有IE保护模式、UI特权隔离、强制完整性控制等这些机制都是默认打开的.至于这些机制的具体细节可以网上找一些资料看下.
    你这里的 SendMessage 失败的原因就是因为有UI特权隔离(UIPI).要想SendMessage成功你可以反UAC给关闭.这个UIPI也会关闭.希望遇到同样问题的朋友能解决。