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