SendInput после EnableWindow в Windows 7 - PullRequest
0 голосов
/ 29 января 2010

У меня есть дочернее окно, которое развернуто в родительском окне.

Его нужно отключить, чтобы он не получал входные данные, пока я не нажму клавишу. Например, когда я нажимаю клавишу «А», я хочу, чтобы дочернее окно было включено, получало входные данные, отправленные с помощью SendInput (), и снова отключало.

Итак, я делаю это:

EnableWindow( hwnd, TRUE );
SetForegroundWindow( hwnd);
SetFocus( hwnd);
Sleep(50);

SendInput()...x7-8 times

EnableWindow( hwnd, FALSE );

Теперь функции EnableWindow работают нормально, за исключением того, что окно пропускает некоторые входные данные. Я попытался установить некоторую задержку после EnableWindow (например, 6-7 секунд !!), и все же он не работает правильно.

Я пытался установить SetWindowPos (), чтобы он обновлял свой кадр, я пытался установить бит WS_DISABLE вручную, но все равно не повезло. Входные данные работают нормально, если дочернее окно постоянно включено.

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Дочернее окно обслуживается тем же потоком, что и его родительское окно. Так что sendInput send ничего не даст, если вы не вернетесь к насосу и не обработаете события, прежде чем снова отключите окно.

Если вы объясните, что вы пытаетесь достичь, мы, вероятно, могли бы дать вам лучший способ сделать это. Но в любом случае, по крайней мере, вам нужно запускать насос сообщений после SendEvents, пока не закончатся события.

Имейте в виду, что насос будет также перекачивать другие сообщения, так что это может привести к падению всей вашей конструкции. Но вот оно.

// process messages until the queue is empty.
//
MSG msg;
while (PeekMessage(&msg, NULL, 0, PM_REMOVE))
{
    // make sure we don't eat the quit message.
    if (WM_QUIT == msg.message)
    {
       PostQuitMessage();
       break;
    }

    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

О, и Sleep () не делает ничего полезного, вы можете его убрать.

Редактировать: этот код отправляется после вызова SendInput и до отключения окна. Вы также можете использовать его вместо Sleep(), чтобы окно успокоилось до Вы SendInput.

0 голосов
/ 02 марта 2010

Вместо SendInput я бы попробовал отправлять сообщения клавиатуры или мыши прямо в дочернее окно. Например:

EnableWindow(hwnd, TRUE);

SendMessage(hwnd, WM_KEYDOWN, ..., ...);
SendMessage(hwnd, WM_KEYUP, ..., ...);
// etc...

EnableWindow(hwnd, FALSE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...