Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Нажатие клавишь вне программы


Автор: ReFleX 15.11.2004, 12:58
Я хочу сделать, чтобы при нажатии определённой клавиши программа скрывалась, а также, при нажатии другой клавиши программа открывалась, естественно клавиша будет нажиматся вне программы.

Надо сделать небольшую шпору smile скоро сессия, подскажите код smile smile

Спасибо! smile

Автор: Mal Hack 15.11.2004, 13:03
Цитата
Я хочу сделать, чтобы при нажатии определённой клавиши программа скрывалась,

Тут сорри, правильного ответа дать не смогу..
Один из вариантов - следующий:
OnIdle у формы. Событие выполняется в момент простоя (не работы) приложения.
Т.е. для отлавливания CapsLock или NumLock можно спокойно использовать.

Автор: azesmcar 15.11.2004, 17:18
Через АПИ Функции
Принцип простой, нужна глобальная функция
Пишешь DLL-ку
Там функцию для переxвата нажатой клавиши.
Из своей проги вызываешь SetWindowsHookEx
idHook => WH_KEYBOARD
lpfn => Адрес твоей функции в DLL
dwThreadId => если дашь 0 то клавиши будут отлавливаться для всеx потоков, если дашь конкретный поток то для него.
А дальше через MSDN, если не получиться пиши, пришлю работающий пример...

CALLBACK функция в DLL должна иметь следующий прототип
Код

LRESULT CALLBACK KeyboardProc(          int code,
   WPARAM wParam,
   LPARAM lParam
);


Автор: JackYF 16.11.2004, 04:35
Люди, вы чего, зачем так сложно?
В программе пишешь примерно такой код:

Код

bool m=GetAsyncKeyState(<код кнопки>);
if (m) //делаем полезные действия;


<Код кнопки> от 0 до 255.

Автор: ReFleX 16.11.2004, 09:50
JackYF
А если кнопка будет нажата вне программы будет работать? smile

Автор: ReFleX 16.11.2004, 10:24
Код
bool m=GetAsyncKeyState(&H78);
if (m){
 Form1->Hide();
}

Выдаёт ошибку в первой строчке: [C++ Error] Unit1.cpp(20): E2451 Undefined symbol 'H78'

Я не тот код кнопки написал?

Автор: ReFleX 22.11.2004, 01:42
Код

bool btnHide = GetAsyncKeyState(0x70);
if (btnHide){
Form1->Hide();
}


http://cppbuilder.hotbox.ru/kod.html

Для следующих

Автор: JackYF 24.11.2004, 02:01
Оно должно работать вне программы! У меня работало

Код кнопки не тот, или что? smile

Автор: ReFleX 24.11.2004, 02:03
Всё спасибо, я разобрался smile
Всё пашет!

Автор: ano360 1.2.2007, 21:01
ReFleX-А где ты этот код вписал?
В каком событии?
разобрался сам-помоги товарисчу

Автор: Romikgy 1.2.2007, 21:48
Цитата(Mal Hack @  15.11.2004,  12:03 Найти цитируемый пост)
OnIdle у формы. Событие выполняется в момент простоя (не работы) приложения.

или отдельный поток юзать

Автор: ano360 1.2.2007, 21:56
borland с++ builder 6 -  нет у формы события.

Добавлено @ 21:57 
мож OnHide?

Автор: Romikgy 1.2.2007, 22:02
небольшая неточность у Mal Hack, но никто не отменял кнопку F1!!!!!
Код

void __fastcall TForm1::MyIdleHandler(TObject *Sender, bool &Done)
{
 // твой код который выше
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{

  Application->OnIdle = MyIdleHandler;
}


Автор: ano360 2.2.2007, 21:21
я использовал ApplicationEvents

да, всё это здорого, но OnIdle срабатывает у меня только после того, как я навиду курсон на форму
т.е. код выполняется только после этого.
Наприменр, если я введу

void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
bool but = GetAsyncKeyState(VK_CONTROL);
if (but){
        Button1->Caption="ctrl";
}

и нажму ctrl, название поменяется только тогда, когда я наведу курсор на форму

Можно сделать, чтоб менялась мгновенно?

Автор: Romikgy 2.2.2007, 22:43
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  bool but = GetAsyncKeyState(VK_CONTROL);
if (but){
        Button1->Caption="ctrl";
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Button1->Caption="none";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Activate(TObject *Sender)
{
Timer1->Enabled=False;
}
//---------------------------------------------------------------------------


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)