Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2012, 18:01   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию Функции ввода для консольных устройств

Добрых суток.
Помогите советом пожалуйста. В консоли при нажатии клавиши ALT и левой кнопки мыши должно выводится какое либо сообщение иначе любое другое сообщение.
Забил что пришло в голову а нифига не работает (хотя по моему все логично)
Заранее спасибо.
Код:
 DWORD rc;
       DWORD actlen,fdwMode,fdwSaveOldMode;
       STARTUPINFO si;
       PROCESS_INFORMATION pi;
       memset(&si, 0, sizeof(STARTUPINFO));
       si.cb=sizeof(si);
       CreationFlags=NORMAL_PRIORITY_CLASS;
       char podsk[]="Input RightAlt+F4 for start A, else for B\n\r";
       char expodsk[] = "\n\rPress ESC for exit\n\r";
       INPUT_RECORD ch;
       HANDLE hstdout,hstdin;

       hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
        if(hstdout==INVALID_HANDLE_VALUE)
                {printf("Error GetStdHandle\n");exit(-1);}

        hstdin=GetStdHandle(STD_INPUT_HANDLE);
        if(hstdin==INVALID_HANDLE_VALUE)
                {printf("Error GetStdHandle\n");exit(-1);}

        unsigned long * c4=&(ch.Event.KeyEvent.dwControlKeyState);


         // Проблема в этой части кода
        ReadConsoleInput(hstdin,&ch,1,&actlen);
        if ((ch.EventType==KEY_EVENT && ch.Event.KeyEvent.bKeyDown && ((*c4 & ~RIGHT_ALT_PRESSED)!= *c4 || (*c4 & ~LEFT_ALT_PRESSED)!= *c4)&&
        ch.EventType==MOUSE_EVENT && (ch.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)))
                 printf("NNNNNNN\n");
        else
                 printf("TTTTTTTTT\n");
       getchar();
       return 0;
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 02.02.2012, 20:25   #2
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Частично разобрался по нажатию ALT и левой кнопки мыши первое сообщение выводится,
а вот условие "Нажатие любых других кнопок" при котором выводится другое сообщение не получается.
Никто не сталкивался с такой проблемой?
Код:
#include <clx.h>
#pragma hdrstop
#include <vcl.h>
#include "windows.h"
#include "process.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"

#pragma argsused
int mas[20];
DWORD CreationFlags;
int main(int argc, char* argv[])
{
       DWORD rc;
       DWORD actlen,fdwMode,fdwSaveOldMode;
       STARTUPINFO si;
       PROCESS_INFORMATION pi;
       memset(&si, 0, sizeof(STARTUPINFO));
       si.cb=sizeof(si);
       CreationFlags=NORMAL_PRIORITY_CLASS;
       char podsk[]="Input RightAlt+F4 for start A, else for B\n\r";
       char expodsk[] = "\n\rPress ESC for exit\n\r";
       INPUT_RECORD ch, ch1;
       HANDLE hstdout,hstdin;

       hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
        if(hstdout==INVALID_HANDLE_VALUE)
                {printf("Error GetStdHandle\n");exit(-1);}

        hstdin=GetStdHandle(STD_INPUT_HANDLE);
        if(hstdin==INVALID_HANDLE_VALUE)
                {printf("Error GetStdHandle\n");exit(-1);}



         unsigned long * c4=&(ch.Event.KeyEvent.dwControlKeyState);

       do {
        ReadConsoleInput(hstdin,&ch,1,&actlen);
        if ( (ch.EventType==MOUSE_EVENT && (ch.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
        && ((ch.Event.MouseEvent.dwControlKeyState & RIGHT_ALT_PRESSED)
        ||(ch.Event.MouseEvent.dwControlKeyState & LEFT_ALT_PRESSED))))
                 printf("NNNNNNN\n");

        // Вот в этом условии проблема программа тупо выводит в бесконечном цикле "TTTTTTTTT"
        if (!(ch.EventType==MOUSE_EVENT && (ch.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
        && ((ch.Event.MouseEvent.dwControlKeyState & RIGHT_ALT_PRESSED)
        ||(ch.Event.MouseEvent.dwControlKeyState & LEFT_ALT_PRESSED))))
                 printf("TTTTTTTTT\n");
        }while (1);


}
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось atenon; 02.02.2012 в 20:27.
atenon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа для мобилных устройств linkod Фриланс 3 26.01.2011 16:20
Определение устройств PnP для DOS. Alexey_DonNTU Помощь студентам 0 14.12.2010 02:53
отваливание всех устройств ввода-вывода и ACPI ROD Компьютерное железо 5 25.11.2010 14:25
Как сделать запрет ввода букв в поле для ввода input zvezda_t PHP 1 27.12.2009 22:02