console ウィンドウハンドルの取得 – プログラミング – Home

console ウィンドウハンドルの取...
 
通知
すべてクリア

[解決済] console ウィンドウハンドルの取得


ttn
 ttn
(@ttn)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

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
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

# 確証はないんですが、

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

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> まだウィンドウができてないタイミングで探しにいってませんか。

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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

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

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


返信引用
ttn
 ttn
(@ttn)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

Banさんありがとう、Banさんの予想通りでした

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました