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


Автор: Гость_max07 3.8.2005, 20:28
Общий приувет!
Вот код, записывает в фаил цобытия от клавы

Код

//--------------------------Project1.cpp---------------------------------------

#include <vcl.h>
#include <condefs.h>
#include <winuser.h>
#include <winbase.h>
#include <stdio.h>

USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
HHOOK hook;
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{       

typedef int (CALLBACK* lpfn)();
lpfn hookfunc; 

HINSTANCE hDLL = LoadLibrary("dll\\project2.dll");

hookfunc = (lpfn)GetProcAddress(hDLL,"KeyboardProc");

hook = SetWindowsHookEx(WH_KEYBOARD, hookfunc, hDLL,  0);

//while(1) {};
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        return 0;
}
//---------------------------------------------------------------------------

//---------------------project2.dll--------------------------------------

#include <vcl.h>
#include <winuser.h>
#include <stdio.h>
#pragma hdrstop
#include <fstream>
using namespace std;

#pragma argsused
extern "C" __declspec(dllexport) LRESULT CALLBACK
KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
  FILE *stream;

  fstream fr("C:\\Logfile.log", ios::app);
  fr << MapVirtualKey(wParam, 2) << " ";
  fr.close();

  return CallNextHookEx(NULL, code, wParam, lParam);
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------



При выполнении получаю вот что:

49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57

Кто нибуть может обяцнить почему код кнопки повтаряется 2 раза?
Если кто знает, как решить эту проблему?

Автор: Гость_max07 4.8.2005, 21:50
Никаких вариантов?

Автор: chaos 5.8.2005, 06:30
нажал отпустил, в чем проблем то?

Автор: chaos 5.8.2005, 07:07
обрабатывай lParam и все у тебя будет хорошо
для примера, можно сделать так
Код

if (lParam < 0) return 0;

Автор: mr.Anderson 8.8.2005, 18:15
Гость_max07, я в вашем коде разобраться не могу (недостаточный уровень знаний пока у меня smile ), но могу предположить, что вы где-то вызвали два раза функцию вывода значений нажатия клавиш. У меня было подобное, когда я вызывал два раза одну и ту же функцию, выводилось по 2 значения.

Автор: max07 8.8.2005, 19:01
Нет, не два раза. Как правильно заметил chaos происходит два события (нажал->отпустил).
я сделал так

Код

  fstream fr(F, ios::app);
  if(lParam >= 0 && (wParam != 16 && (97 <= ch && ch <= 'z')))
   fr << ch << " " << char(ch) << endl;


Теперь всё ОК smile
Только SHIFT не ловит smile, ловит только код прописных букв.

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