2016-04-13 13 views
0

コールバック関数ShowWindowを使用してウィンドウを表示しようとしましたが、呼び出されたコールバックはSetTimeによって隠されていますが、機能しませんでした。 次のコード例を確認してください。Win32:非表示にした後にウィンドウを表示できませんか?

#define _WIN32_WINNT 0x0500 
#include<windows.h> 
void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime) 
{ 
    MessageBoxA(NULL,"Test","test2",MB_OK); 
    ShowWindow(hwnd, SW_SHOW); //This will not show the window :(
    MessageBoxA(NULL,"Is it shown?","test2",MB_OK); 
} 
int main() 
{ 
    MSG msg; 
    ShowWindow(GetConsoleWindow(), SW_HIDE); 
    SetTimer(NULL, 0, 1000*3, &f); 
    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return 0; 
} 

ありがとうございます。

+0

なぜ 'f'をキャストしましたか?そのキャストを削除します。あなたはエラーをチェックしません。何故なの? –

+0

わかりやすく、何も「うまくいかない」*。テキストは、それが隠された後、ウィンドウを表示することはできません。コードは何かを言います( 'ShowWindow(hwnd、SW_SHOW); //ウィンドウを非表示にしません)。私はあなたがなぜ間違った[TimerProc](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644907.aspx)署名を選択したのかわかりません。 – IInspectable

+1

'ShowWindow'コール(' f'の内側)にブレークポイントを設定して、 'hwnd'の値を観察してみませんか?タイマーはウィンドウに関連付けられていないので、私はそれが 'NULL'だと思います。 – IInspectable

答えて

0

@IInspectableが示唆しているように、コールバック機能(これはSetTimerに渡されたハンドルNULLです)が実行する間違ったハンドルです。

上記のコードを修正するには、showの両方に同じハンドルを使用する必要があります。を非表示にする必要があります。

#define _WIN32_WINNT 0x0500 
#include<windows.h> 
HWND hwnd; 
void CALLBACK f(HWND __hwnd__, UINT uMsg, UINT timerId, DWORD dwTime) 
{ 
    MessageBoxA(NULL,"Test","test2",MB_OK); 
    ShowWindow(hwnd, SW_SHOW); //This will not show the window :(
    MessageBoxA(NULL,"Is it shown?","test2",MB_OK); 
} 
int main() 
{ 
    MSG msg; 
    hwnd=GetConsoleWindow(); 

    ShowWindow(hwnd , SW_HIDE); 

    SetTimer(NULL, 0, 1000*3, &f); 
    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return 0; 
} 

ありがとうございます。

関連する問題