GetMessage
MSG msg;
bRet = GetMessage(&msg, hwnd, 0, 0);
hwnd существует и работает. Однако, GetMessage(&msg, hwnd, 0, 0) не возращает вообще ничего. Такое впечатление, будто прога входит в GetMessage и там зацикливается навсегда ничег не возвращая.
Как лечить(ся)?
BOOL bRet = true;
MSG msg;
bRet = GetMessage(&msg, hwnd, 0, 0);
hwnd существует и работает. Однако, GetMessage(&msg, hwnd, 0, 0) не возращает вообще ничего. Такое впечатление, будто прога входит в GetMessage и там зацикливается навсегда ничег не возвращая.
Как лечить(ся)?
Такого не бывает. И код у тя маленький. Чего тебе лечить? И что он должен возвраащть? Какие у тебя проблемы??
Что код после GetMessage не выполняется?
Такого не бывает. И код у тя маленький. Чего тебе лечить? И что он должен возвраащть? Какие у тебя проблемы??
Что код после GetMessage не выполняется?
ОК. Вот код подлиней:
BOOL bRet = true;
MSG msg;
//bRet = GetMessage(&msg, NULL, NULL, NULL);
while((bRet = GetMessage(&msg, hwndChild, NULL, NULL)) != 0)
{
if(bRet == -1)
cout << "Error" << endl;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
cout << msg.hwnd << endl;
}
cout << msg.hwnd << endl;
}
к сожалени, проблема остается та же...
ОК. Вот код подлиней:
BOOL bRet = true;
MSG msg;
//bRet = GetMessage(&msg, NULL, NULL, NULL);
while((bRet = GetMessage(&msg, hwndChild, NULL, NULL)) != 0)
{
if(bRet == -1)
cout << "Error" << endl;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
cout << msg.hwnd << endl;
}
cout << msg.hwnd << endl;
}
к сожалени, проблема остается та же...
код вроде правильный,попробуй перед циклом вызвать ShowWindow(hwndChild,SW_SHOW);
Если не поможет покажи как у тебя создается hwndChild
HWND hwnd;
char p[255];
while(1)
{
hwnd = ::FindWindow("CTable", NULL);
::EnumChildWindows(hwnd,EnumChildProc, NULL);
}
char p[255];
while(1)
{
hwnd = ::FindWindow("CVotBlinTable", NULL);// GetWindow(hwnd,GW_HWNDNEXT);
::EnumChildWindows(hwnd,EnumChildProc, NULL);
}
и функция:
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
char p[255];
::GetClassName(hwndChild, p, 1024);
if( strstr(p, "CGrid") &&
::IsWindowVisible(hwndChild) &&
::IsWindowEnabled(hwndChild)
)
{
BOOL bRet = true;
MSG msg;
while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
cout << "Closing..." << endl;
else if(msg.message == WM_KEYUP)
cout << "KEY UP..." << endl;
else
cout << msg.message << endl;
TranslateMessage(&msg);
DispatchMessage(&msg);
cout << msg.message << endl;
}
}
return true;
}
Пояснения: СGrid — это грид — контрол т.е.
Нужно мне отоловить нажатие клавиш. А именно была ли нажата и код клавиши.
HWND hwnd;
char p[255];
while(1)
{
hwnd = ::FindWindow("CVotBlinTable", NULL);// GetWindow(hwnd,GW_HWNDNEXT);
::EnumChildWindows(hwnd,EnumChildProc, NULL);
}
и функция:
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
char p[255];
::GetClassName(hwndChild, p, 1024);
if( strstr(p, "CGrid") &&
::IsWindowVisible(hwndChild) &&
::IsWindowEnabled(hwndChild)
)
{
BOOL bRet = true;
MSG msg;
while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
cout << "Closing..." << endl;
else if(msg.message == WM_KEYUP)
cout << "KEY UP..." << endl;
else
cout << msg.message << endl;
TranslateMessage(&msg);
DispatchMessage(&msg);
cout << msg.message << endl;
}
}
return true;
}
Пояснения: СGrid — это грид — контрол т.е.
Нужно мне отоловить нажатие клавиш. А именно была ли нажата и код клавиши.
И че ты пытаешся сделать,терь понятно почему GetMessage ничего не возвращяет - да потому что у данного контрола уже есть свой обработчик и он перехватывает все системные сообщения. А для того чтобы тебе их перехватить нужно подменить его процедуру окна на свою и там уже отлавливать события,т.е. здесь используй субклассинг.