console ウィンドウハンドルの取得

[戻る]
ttn 2006/01/20(金) 01:45:11
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でした。

Ban 2006/01/20(金) 09:08:07
# 確証はないんですが、

まだウィンドウができてないタイミングで探しにいってませんか。
ためしに、FindWindowの前にSleep入れてちょっと待ってみるとか。
もしくは、コンソールアプリでなくコンソールを作っているなら、
WaitForInputIdleしてみるとか。

# XP/2000限定なら、GetConsoleWindowとか.....

Ban 2006/01/20(金) 09:10:51
> まだウィンドウができてないタイミングで探しにいってませんか。

まだウィンドウの名前認識できてないタイミングで、といった方がよいかも。

たいちう 2006/01/20(金) 09:50:49
> > まだウィンドウができてないタイミングで探しにいってませんか。
> まだウィンドウの名前認識できてないタイミングで、といった方がよいかも。

ということなので、Sleepで解決しました。

Sleep(0);
hwnd = ::FindWindow(NULL, szTitle);
SetWindowText(hwnd, "HOGE");

ttn 2006/01/20(金) 21:58:39
[[解決]]
Banさんありがとう、Banさんの予想通りでした

「まだウィンドウができてないタイミングで探しにいって」
いました。
実際にはSTD_OUTPUT、STD_INPUTのハンドルを取得したりするので、
その後にFindWindow()してやったら問題なくなりました。

もちろんSleep()でもOKでした。

GetConsoleWindow()も確かにありなんですが2000以上ってのがねぇ
WaitForInputIdleは知らなかったので遊んでみます。

たいちうさんも代わり(?)に実験してくだすったようでありがと

古いスレッドには追加発言できません。