main()で始めるConsoleのウィンドウハンドルはFindWindow()で入手できます。
WinMain()で始めてAllocConsole()でconsoleを作った場合も同様にできるものと思い
やったところFindWindowでNULLが返ってきてしまいました。
GetLastError()ではハンドルが無効です(VC6の場合)と言われます。
以下に2つの該当部分を書きます
includeはどちらもwindows.hとstdio.h
-----------------------------------------------
int main(){
HWND hwnd;
TCHAR szTitle[MAX_PATH];
::SetConsoleTitle(ZYX);
::GetConsoleTitle(szTitle,MAX_PATH);
hwnd = ::FindWindow(NULL,szTitle);
-----------------------------------------------------
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int cmdshow){
HWND hwnd;
if(!AllocConsole()){ return 0;}
else
{
::SetConsoleTitle(ZYX);
TCHAR szTitle[MAX_PATH];
::GetConsoleTitle(szTitle,MAX_PATH);
hwnd = ::FindWindow(NULL,szTitle);
----------------------------------------------------------
AllocConsoleで作り出したconsoleウィンドウのHWNDはどうやって
手に入れるもんなんでしょうか?
環境はVC6(SP5)です、尚VC8ExpressでもNULLでした。
# 確証はないんですが、
まだウィンドウができてないタイミングで探しにいってませんか。
ためしに、FindWindowの前にSleep入れてちょっと待ってみるとか。
もしくは、コンソールアプリでなくコンソールを作っているなら、
WaitForInputIdleしてみるとか。
# XP/2000限定なら、GetConsoleWindowとか.....
> まだウィンドウができてないタイミングで探しにいってませんか。
まだウィンドウの名前認識できてないタイミングで、といった方がよいかも。
> > まだウィンドウができてないタイミングで探しにいってませんか。
> まだウィンドウの名前認識できてないタイミングで、といった方がよいかも。
ということなので、Sleepで解決しました。
Sleep(0);
hwnd = ::FindWindow(NULL, szTitle);
SetWindowText(hwnd, HOGE);
Banさんありがとう、Banさんの予想通りでした
「まだウィンドウができてないタイミングで探しにいって」
いました。
実際にはSTD_OUTPUT、STD_INPUTのハンドルを取得したりするので、
その後にFindWindow()してやったら問題なくなりました。
もちろんSleep()でもOKでした。
GetConsoleWindow()も確かにありなんですが2000以上ってのがねぇ
WaitForInputIdleは知らなかったので遊んでみます。
たいちうさんも代わり(?)に実験してくだすったようでありがと