我最近需要做一个程序,需要在【新的】IE窗口启动的时候进行操作。比如:我现在启动了IE,我的程序就执行一个函数。
      
      然后我又打开了一个IE,我的程序就又执行这个函数。
问题:我如何判断当前的IE是否是新打开的,不是已经函数处理过的IE窗口。

解决方案 »

  1.   

    SetProp  函数功能:该函数在指定窗口的属性表中增加一个新项,或者修改一个现有项。如果指定的字符串不在属性表中,那么就增加该新的项,新项中包含该字符串和句柄,否则就用指定的句柄替换该字符串的全前句柄。
      函数原型:BOOL SetProp(HWND hWnd,LPCTSTR lpString,HANDLE hData);
      参数:
      hWnd:指向窗口的句柄,该窗口的属性表要接收一个新项。
      lpString:指向以null结尾的字符串指针,或者包含一个标识字符串的原子。如果该参数是一个原子,么它必须是以前使用GlobalAddAtom函数创建的。原子是16位的数据值,它必须是放置在lpstring参数低位字中,而高位字必须为O。
      hData:指向要拷贝到属性表中的数据的句柄。该数据句柄可以标识任何对应用程序有用的值。
      返回值:如果该数据句柄和字符串以加到属性表中,那么返回值为非零。如果该函数失败,那么返回为零。若想获得更多错误信息,请调用GetLastError函数。GetProp  函数功能:该函数从给定窗口的属性列表中检索数据句柄。给定的字符串标识了要检索的句柄。该字符串和句柄必须在前一次调用SetProp函数时已经加到属性表中。
      函数原型:HANDLE GetProp(HWND hWnd,LPCTSTR lpString);
      参数:
      hWnd:指向要搜索属性表的窗口。
      LpString:指向以null结尾的字符串指针,或者包含一个标识字符串的原子。如果该参数是一个原子,那么它必须是使用GlobalAddAtom函数创建的。原子是16位的数据值,它必须是放置在lpstring参数的低位率中,而高位字必须为O。
      返回值:如果属性表中包含了给定的字符串,那么返回值为相关的数据句柄。否则,返回值为NULL。
      

  2.   

    TO 1楼:如果保存起来的话,一直用IE上网的话,句柄最后太多,数量不好把握,最终CPU受不了。
      

  3.   

    TO 2楼:
    BOOL SetProp(HWND hWnd,LPCTSTR lpString,HANDLE hData); 
    最后一个参数HANDLE hData  ,我需要传递一个什么值,我的程序是控制台程序,没有this指针。
      

  4.   

    随便写什么数据,强制转换成HANDLE就成。我说,你不会Google啊?
      

  5.   

    TO 5楼:
    我设定了  :
          SetProp(hIEhwnd,"abababab",(HANDLE)1);
         SetIeUrl(hIEhwnd);然后我读取:
          char szStr[256] = {0};
         GetProp(hIEhwnd,szStr);
          cout<<szStr<<endl;    结果:读取回来的szStr就不是"abababab"。
      

  6.   

    可以用全局WH_SHELL钩子,在Shell启动一个进程时,判断该进程是否IE进程,然后再调用你的相关操作.
    详细信息可见msdn的 SetWindowsHookEx 函数
      

  7.   

    句柄强制转换成一个DWORD来保存就行了。