关于获取窗口句柄的有关问题

关于获取窗口句柄的问题
如下:


#include <stdio.h>
#include <windows.h>


int main(void)
{
    
    HANDLE hOut;  
                               
    ShellExecute(NULL,"open","E:\\Hello.exe",NULL,NULL,SW_SHOWNOACTIVATE);  getch();
    hOut=FindWindow(NULL,"E:\\Hello.exe");  /*获得窗口句柄*/
    printf("%ld ",hOut);
    getch();
    PostMessage(hOut,WM_CLOSE,0,0);
          
    exit(0);
    
}

有 getch(); 时,就能获取句柄;当把getch();删除后,句柄就为0了。请问为什么?谢谢。
------解决方案--------------------
引用:
如下:


#include <stdio.h>
#include <windows.h>


int main(void)
{
    
    HANDLE hOut;  
                               
    ShellExecute(NULL,"open","E:\\Hello.exe",NULL,NULL,SW_SHOWNOACTIVATE);  getch();
    hOut=FindWindow(NULL,"E:\\Hello.exe");  /*获得窗口句柄*/
    printf("%ld ",hOut);
    getch();
    PostMessage(hOut,WM_CLOSE,0,0);
          
    exit(0);
    
}


有 getch(); 时,就能获取句柄;当把getch();删除后,句柄就为0了。请问为什么?谢谢。


没有getch();这个程序就直接将E:\\Hello.exe程序的句柄给关掉了(PostMessage(hOut,WM_CLOSE,0,0);)

getch();起的作用就是让程序停在这里。让你看见打印出来的句柄printf("%ld ",hOut);

你可以用while (1){Sleep(1000);}代替getch(); 这样也可以看到打印句柄
------解决方案--------------------
原因很简单,ShellExecute返回是很快的,如果没有getch让程序停在那,就会立刻执行下一句FindWindow。但是此时ShellExecute所打开的程序的窗口甚至都没创建出来,自然是什么都find不到喽,所以就返回0,但有了getch,就有足够的时间让窗口彻底生成出来,这样等lz随便输个字符,就能正确找到窗口的句柄了
------解决方案--------------------
有一个getchar,你的hello已经结束了,获取不到了。如果没有getchar,程序直接往下执行,这时候hello这个进程还没有来得及结束掉。当然也有可能你不加getchar,在下一句获取handle的时候也已经结束了。你将getchar换成sleep(2000),你也获取不到句柄了。
------解决方案--------------------
没有getchar,阻塞本进程,

引用:
Quote: 引用:

Quote: 引用:

如下:


#include <stdio.h>
#include <windows.h>


int main(void)
{
    
    HANDLE hOut;  
                               
    ShellExecute(NULL,"open","E:\\Hello.exe",NULL,NULL,SW_SHOWNOACTIVATE);  getch();
    hOut=FindWindow(NULL,"E:\\Hello.exe");  /*获得窗口句柄*/
    printf("%ld ",hOut);
    getch();
    PostMessage(hOut,WM_CLOSE,0,0);
          
    exit(0);
    
}


有 getch(); 时,就能获取句柄;当把getch();删除后,句柄就为0了。请问为什么?谢谢。


没有getch();这个程序就直接将E:\\Hello.exe程序的句柄给关掉了(PostMessage(hOut,WM_CLOSE,0,0);)

getch();起的作用就是让程序停在这里。让你看见打印出来的句柄printf("%ld ",hOut);

你可以用while (1){Sleep(1000);}代替getch(); 这样也可以看到打印句柄



没说清楚,我说的是ShellExecute 语句后的getch(); 不是第二个getch() .

如果没有shellexecute后面阻塞一下,这个shellexecute本身的程序还没来得及把新的进程
创建出来,你就直接FindWinodws是找不到的,你阻塞一下那么Shellexecute的新进程就有足够时间
把新进程创建出来。因为Shellexecute本身是异步的。
------解决方案--------------------
引用:
有一个getchar,你的hello已经结束了,获取不到了。如果没有getchar,程序直接往下执行,这时候hello这个进程还没有来得及结束掉。当然也有可能你不加getchar,在下一句获取handle的时候也已经结束了。你将getchar换成sleep(2000),你也获取不到句柄了。
++