我用createprocess启动记事本以后,想向它发送消息,应该如何做,
好像找不到它的窗口句柄,也就用不了Sendmessage了
如果不用SendMessage那么还有什么其他办法操纵这个启动了的记事本
例如让它显示一个字符串, 这个字符串来源于启动他的应用程序
该怎么做
谢谢

解决方案 »

  1.   

    FindWindow可以得到句柄,不过想用SendMessage来向他传递字符串估计不太可能.
      

  2.   

    //sleep a while,then postmessage,such as 
    int main()
    {
       ...
       const int k=2; // in seconds   strcpy(lpCommandLine, "E:\\WINNT\\SYSTEM32\\CALC.EXE");
        
     if (!CreateProcess(NULL, lpCommandLine,
                     NULL, &threadSA,
            FALSE,
     
    HIGH_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
            NULL, NULL,
            &startInfo,
            &processInfo))
     {
      fprintf(stderr, "CreateProcess failed on error %d\n",
    GetLastError());
      ExitProcess(1);
     }
       Sleep(5000);
       HWND pProcess = FindWindow("SciCalc",0);
       PostMessage(pProcess, WM_CLOSE,0,0);   ExitProcess(1);
       return 0;
    }
      

  3.   

    使用WM_COPYDATA应该可以实现通过消息传递字符串。事实上可以传递任何一块数据。具体用法MSDN上有解释的。不过我没有试过这样做,不知道是不是真的可以。
      

  4.   

    得到窗口句柄后可以
    用WM_COPYDATA来传送字符串。
      

  5.   

    续继问,我现在可以用sendmessage关闭打开的记事本了,请问通过我的程序向记事本写入
    字符串
      

  6.   

    将字串用WM_COPYDATA送出后,试试发送其他消息来完成你需要的功能,例如WM_SETTEXT等。注意如果要引用字符串,则要以Notepad地址空间的地址来引用。
      

  7.   

    得到应用程序句柄后,再进一步得到文本框的句柄,然后向里面写东西。
    我没搞过SDI的东东,对于Dialog是可以通过这种方法进行操作的。一个建议,不一定好使,大家讨论一下:)
      

  8.   

    不知道为什么,我用sendmessage没有用
    是不是要接入notepad的输入线程,过去好像有人是这么做的
      

  9.   

    你做个钩子看然后用MessageBox显示一下记事本中输入框的id号码,这样你可以通过现在所知道的记事本窗口句柄来得到输入框的句并(id号码是不会变的,没个打开的记事本都是相同的),然后再利用SendMessage发送就搞定
      

  10.   

    我已经实现了,具体方法如下
    1、先得到启动的记事本的句柄,
    2、用findwindowex找到工作区的句柄,也就是文本框的句柄,然后向他发消息就可以了
    谢谢大家的帮助