我取得该Edit控件的句柄后,用SendMessage(hEdit,WM_SETTEXT,0,LPARAM(MyMsg)直接发
消息修改Edit的文本,没有反应;在SendMessage前面加上一句Sleep(N),则当N足够大时
可以成功修改Edit的内容,N不够大时可能成功,也可能失败。
是否有一种方法判断什么时候能发SendMessage?
(SnedMessage之前,Edit的内容为空)

解决方案 »

  1.   

    The return value is TRUE if the text is set. It is FALSE (for an edit control), LB_ERRSPACE (for a list box), or CB_ERRSPACE (for a combo box) if insufficient space is available to set the text in the edit control. It is CB_ERR if this message is sent to a combo box without an edit control. 看MSDN的帮助还不清楚? 
      

  2.   

    你可以先sendmessage,然后通过返回值判断成功与否
      

  3.   

    先谢谢大家,我比较少用API,一般是看DELPHI的帮助。不过我还没弄清楚,同样是设置EDIT的内容,为什么有的时候会失败。
      

  4.   

    试了以下几种方法,还是会出现失败的情况:
    方法一:
      while True do
        if (SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PicName))<>0) then
           break;方法二:
      while (SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PicName))=0) do;方法三:
      EditText := '';
      while EditText<>PicName do
      begin
        SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(Path+PicName));
        SendMessage(hEdit, WM_GETTEXT, 255, LongInt(@EditText));
      end;我做的事情是:打开WINDOWS自带的画图程序(MSPAINT.EXE),然后循环以下步骤,处理一批JPG文件:
    A、调出“打开”对话框;
    B、自动填入文件名;
    C、自动执行“打开”按钮的功能;
    D、对装入的JPG作一些处理;
    E、发送“CTRL+S”消息进行保存现在就是步骤B可能会失败,一旦失败,程序就卡住了,必须手工关闭对话框才行。源程序如下,请DX们看看:
      …………
      while True do  //wait for open the main window(MSPAINT.EXE)
      begin
        FWindowHandle:=FindWindow(PChar('MSPaintApp'),nil);
        if FWindowHandle<>0 then
        begin
          PaintOpened := True;
          break;
        end;
      end;  if PaintOpened then
        for i:=0 to (FileList.Count-1) do
        begin
          ProcessJPG(FileList[i]);  //
          sleep(600);       //wait for write file to disk;
          Gauge1.Progress := Gauge1.Progress+1;
        end;
        …………
    procedure TForm1.ProcessJPG(PicName: string);
    var
      i: integer;
      DlgOpend: Boolean;
      hDlg, h1, h2, hEdit: THandle;
      EditText: array[0..255] of char;
    begin
      DlgOpend := False;
      hDlg := 0;
      h1 := 0;
      h2 := 0;
      hEdit := 0;  PostMessage(FWindowHandle,WM_COMMAND,57601,0);  //Call by the "Open" dialog  for i:=0 to 60 do  //wait 6 seconds for open the main window
      begin
        hDlg:=FindWindow(nil,'打开');
        if hDlg<>0 then
        begin
          DlgOpend := True;
          break;
        end;
        Sleep(100);
      end;  if DlgOpend then
      begin
        h1 := GetDlgItem(hDlg,1148);
        if h1<>0 then
        begin
          h2 := GetDlgItem(h1,1148);
          if h2<>0 then
          begin
            hEdit := GetDlgItem(h2,1148);  
            if hEdit<>0 then
            begin
              EditText := '';          while EditText<>(PicName) do
              begin
                SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PicName));
                SendMessage(hEdit, WM_GETTEXT, 255, LongInt(@EditText));
              end;
              PostMessage(hDlg, WM_COMMAND, IDOK, 0);  // Hotkey: "OK"
              for i:=0 to 600 do
              begin
                hDlg:=FindWindow(nil,'打开');
                if hDlg=0 then
                begin
                  …………    // Processing the image
                  PostMessage(FWindowHandle,WM_COMMAND,57603,0);  //Hotkey: Ctrl+S
                  break;
                end;
                Sleep(100);
              end;
            end;
          end;
        end;
      end;
    end;
      

  5.   

    需要確認的是hEdit是否為目標窗口?可以先在目標窗口輸入一字串,再WM_GetText看是否能取到....
      

  6.   

    楼主你太次了!
    用画图打开一个文件不应该用你这种低效率的方法。简单的做法是执行下面的代码实现:WinExec('mspaint c:\eee.jpg',1);
      

  7.   

    TO csshow: 
       PostMessage发送WM_SETTEXT消息,Edit窗口没有反应;TO Avan_Lau:
       hEdit的确是目标窗口,我是用SPY++取的ID,而且,我是循环处理一批图像,前文说了,向hEdit写文本时“可能失败”,具体地说,打开41个JPG文件,有3、4次会失败,其余30多次是成功的。如果目标窗口不对,就不可能会有成功的。另外,源码中有一句:SendMessage(hEdit, WM_GETTEXT, 255, LongInt(@EditText)),能正确取到文本;TO mwy654321:
       WinExec('mspaint c:\eee.jpg',1)当然没问题,可是我要循环处理几千个JPG文件,那就要打开、关闭几千次MSPaint.EXE,效率是不是太低了?而且,为了让程序执行的时候还能做其他的事,MSPaint.EXE必须用线程方式在后台隐式调用,不适合用WinExec方式。
      

  8.   

    是不是DELPHI对SENDMESSAGE的处理有问题?没有人可以帮我吗?
      

  9.   

    晕,几天没注意这个贴子,不料你已经结贴了。我的方法是可行的,WinExec('mspaint c:\eee.jpg',1)打开一个处理完后关闭,有几千个也照样行得通,谈不上效率低,因为你用打开对话框打开,照样也得打开几千次。只要及时关闭后再打开下一个,效率就是一样的。关于在后台运行,可以在虚拟桌面中执行winExec来解决隐藏的问题,而你这种方法,调出打开对话框,照样会跳出窗口,不能完美隐藏。既然你已经结贴,我说再多也没用,唉,算了。
      

  10.   

    TO mwy654321: 不好意思,今天才看到你的回复。虽然我已经结贴,但我们还可以再讨论啊,请到http://topic.csdn.net/u/20100813/13/d6996f06-188c-452f-80b9-abf07aea9d75.html接分。