Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает GetKeyNameText!!!! 
:(
    Опции темы
TeeT
Дата 10.5.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



.....

struct S_SAVE_EVENTMSG
{
    S_SAVE_EVENTMSG() { memset(this,0,sizeof(S_SAVE_EVENTMSG)); }

    UINT  message;
    UINT  paramL;
    UINT  paramH;
    DWORD time;
};

main()
{
  S_SAVE_EVENTMSG *p = new S_SAVE_EVENTMSG[sizeof(S_SAVE_EVENTMSG)];

  FILE* in = fopen("data.$$$", "r");
  fread( p, sizeof(S_SAVE_EVENTMSG), 1, in);

  if(!p) perror("AAA!!");

//    TCHAR szKeyName[20];
//  LPTSTR szKeyName;
  char *szKeyName = new char[20];

  WORD wLo = LOWORD( p->paramL );
  BYTE bLo = LOBYTE( wLo );

  int res = GetKeyNameText(bLo, szKeyName, 19);
  printf("%s", szKeyName);
  delete szKeyName;
  delete p;
  fclose(in);
} 
PM MAIL   Вверх
TeeT
Дата 19.5.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



Она до сих пор не работает !-)  smile   smile  
PM MAIL   Вверх
_hunter
Дата 19.5.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



Цитата(TeeT @  19.5.2006,  11:59 Найти цитируемый пост)
Она до сих пор не работает

это плохо...

а почему не работает? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
GremlinProg
Дата 19.5.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



здесь есть некоторые ошибки, скорее даже недочеты, но они не влияют на вызов GetKeyNameText. Попробуй посмотреть на содержимое p сразу после чтения, может быть там ничего нет, мусор? 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
TeeT
Дата 27.5.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



Дело в том, что суда:
Код

  int res = GetKeyNameText(bLo, szKeyName, 19);
  printf("%s", szKeyName);

я ставлю так:
Код

                                                  [B]!!![/B]
  int res = GetKeyNameText([B]4568754[/B], szKeyName, 19);
  printf("%s", szKeyName);

то есть константу, а res все равно ничего не дает ;(
какая кодировка используется? может мне надо к моим значениям прибавлять что нибудь?
p.s. иногда, при подстановке очередной константы она выдает название, но закономерности я не понял smile 
PM MAIL   Вверх
Damarus
Дата 28.5.2006, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



TeeT, тебе стоит изучить описание GetKeyNameText smile 
Цитата

GetKeyNameText Function

Syntax
Код
int GetKeyNameText(LONG lParam, LPTSTR lpString, int nSize);


Parameters

  • lParam
    [in] Specifies the second parameter of the keyboard message (such as WM_KEYDOWN) to be processed. The function interprets the following bit positions in the lParam.

    • 16—23 Scan code.
    • 24 Extended-key flag. Distinguishes some keys on an enhanced keyboard.
    • 25 "Don't care" bit. The application calling this function sets this bit to indicate that the function should not distinguish between left and right CTRL and SHIFT keys, for example.

  • lpString
    [out] Pointer to a buffer that will receive the key name. 
  • nSize
    [in] Specifies the maximum length, in TCHAR, of the key name, including the terminating null character. (This parameter should be equal to the size of the buffer pointed to by the lpString parameter.)


Return Value
If the function succeeds, a null-terminated string is copied into the specified buffer, and the return value is the length of the string, in TCHAR, not counting the terminating null character. 

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
The format of the key-name string depends on the current keyboard layout. The keyboard driver maintains a list of names in the form of character strings for keys with names longer than a single character. The key name is translated according to the layout of the currently installed keyboard, thus the function may give different results for different input locales. The name of a character key is the character itself. The names of dead keys are spelled out in full. 

Windows 95/98/Me: GetKeyNameTextW is supported by the Microsoft Layer for Unicode. To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.
 
PM MAIL ICQ Jabber   Вверх
TeeT
Дата 28.5.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



Damarus у меня тоже есть Хэлп по API, но то что там пишут не всегда до конца - все равно остаётся какой нибудь нюанс. 
К сведенью: констаны которые я подставляю я брал функцией SetWindowsHook, то есть кодировка и формат в принципе должжны быть понятны. В HEX редакторе буквы довольно понятны 
PM MAIL   Вверх
Damarus
Дата 28.5.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



TeeT, ты плохо читал Хэлп. Тамже ясно написано - за кнопку отвечают биты 16-24 параметра lParam. Учитывая это, непонятно, почему ты передаёш GetKeyNameText в первом параметре байт.
Неявно преобразовавшись в LONG этот байт станет младшим байтом LONG. Однако в Хэлпе написано, что младшие два байта функцией не рассматриваются.

А вообще, обьясни подробней, что ты хочеш сделать и что есть S_SAVE_EVENTMSG. 
PM MAIL ICQ Jabber   Вверх
TeeT
Дата 31.5.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



Цитата(Damarus @  28.5.2006,  15:28 Найти цитируемый пост)
что есть S_SAVE_EVENTMSG.

Смотри в начале темы!!!
Цитата(Damarus @  28.5.2006,  15:28 Найти цитируемый пост)
что ты хочеш сделать

Клавиатурного шпиона.
 
PM MAIL   Вверх
Damarus
Дата 1.6.2006, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата

Смотри в начале темы!!!

И описание там есть smile ?

Цитата

Клавиатурного шпиона.

Странный подход smile. 
PM MAIL ICQ Jabber   Вверх
TeeT
Дата 3.6.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



Цитата(Damarus @  1.6.2006,  08:55 Найти цитируемый пост)
И описание там есть smile ?


Да вроде бы все понятно!-) какая строчка интерисует? могу поподробнее  smile 

Код

struct S_SAVE_EVENTMSG
{
    S_SAVE_EVENTMSG() { memset(this,0,sizeof(S_SAVE_EVENTMSG)); }

    UINT  message;
    UINT  paramL;
    UINT  paramH;
    DWORD time;
};


Цитата(Damarus @  1.6.2006,  08:55 Найти цитируемый пост)
Странный подход smile.  

 есть предложения smile 

P.S. программа написана на Си  smile  
PM MAIL   Вверх
Damarus
Дата 3.6.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата(TeeT)

Да вроде бы все понятно!-) какая строчка интерисует? могу поподробнее  smile  


Что должно содержаться в членах структуры? Как записываеться data.$$$?

Цитата(TeeT)

 есть предложения   smile 


Есть вопросы. Что за программа в первом посте? На клавиатурного шпиона она не тянет smile На viewer лога шпиона тоже.

Цитата

P.S. программа написана на Си  smile 


Я уж думал на VB smile  
PM MAIL ICQ Jabber   Вверх
TeeT
Дата 5.6.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 9.12.2005
Где: Нальчик

Репутация: нет
Всего: нет



Код

.....
struct S_ENODE {
    EVENTMSG    Event;
    S_ENODE    *lpNext;
};
....
S_ENODE *g_lpEventChain    = NULL;  // Head of recorded Event List
static    S_ENODE *g_lpLastEvent    = NULL;  // Tail of recorded Event List
static    S_ENODE *g_lpPlayEvent    = NULL;  // Current Event being played
....
LRESULT CALLBACK JournalRecorderFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(!g_hHookRecorder)
        return 0;

    if(nCode == HC_SYSMODALON)
        g_fSysModalOn = TRUE;
    else
    if(nCode == HC_SYSMODALOFF)
        g_fSysModalOn = FALSE;
    else
    if(nCode == HC_ACTION && g_hHoohPlayBack) { // Skip recording while playing back
        
        fnStop_Recorder(SI_E_RC_SC_BUSY);
        
        return 0;
    }

    if(nCode == HC_ACTION && !g_fSysModalOn) {

        LPEVENTMSG lpEvent= (LPEVENTMSG)lParam;

        // STOP - user stops recording by pressing CTRL+BREAK
        if(lpEvent->message == WM_KEYDOWN && LOBYTE(lpEvent->paramL) == VK_CANCEL) {
            
            fnStop_Recorder(SI_E_RC_SC_DONE);
            
            return 0;
        }

        if(lpEvent->message == WM_KEYDOWN || lpEvent->message == WM_KEYUP ) {

        S_ENODE *lpEventNode= (S_ENODE*)malloc(sizeof(S_ENODE));

        if(lpEventNode == NULL) {    // Not enough memory

            fnStop_Recorder(SI_E_RC_SC_MEMORY);

            return 0;
        }

        if(g_lpLastEvent == NULL )
            g_lpEventChain = lpEventNode;
        else
            g_lpLastEvent->lpNext = lpEventNode;

        g_lpLastEvent = lpEventNode;
        g_lpLastEvent->lpNext = NULL;

        g_lpLastEvent->Event.message    = lpEvent->message;
        g_lpLastEvent->Event.paramL    = lpEvent->paramL;
        g_lpLastEvent->Event.paramH    = lpEvent->paramH;
        g_lpLastEvent->Event.time        = GetTickCount(); //lpEvent->time;
        g_lpLastEvent->Event.hwnd        = NULL;

        // inform the manager about the message recorded
        PostMessage(g_hWndManager, WM_SERVICE_INFO, SI_S_RC_EVENT, (LPARAM)g_lpLastEvent);
        
        return 0;
        }
    }

   return (CallNextHookEx(g_hHookRecorder, nCode, wParam, lParam));
}


Цитата

EVENTMSG
 в Хелпе АПИ  есть, выглядит приблизительно так:
Код

sruct EVENTMSG
{
    UINT  message;
    UINT  paramL;
    UINT  paramH;
};
, хэлпа под рукой нет, щас точнее сказать не могу

Цитата

Есть вопросы. Что за программа в первом посте? На клавиатурного шпиона она не тянет smile На viewer лога шпиона тоже.

Мне надо было всю прогу выкладывать, или проблему?? какая разница что делает первая прога? задача стоит в том что Не работает GetKeyNameText!!!! помоему я так спросил в начале 
PM MAIL   Вверх
Damarus
Дата 5.6.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата

Мне надо было всю прогу выкладывать, или проблему?? какая разница что делает первая прога? задача стоит в том что Не работает GetKeyNameText!!!! помоему я так спросил в начале 


Вообщем в первой программе пиши так:
Код
int res = GetKeyNameText(p->paramL, szKeyName, 19);


PS. CallNextHookEx можно вызывать так:
Код
CallNextHookEx(0, nCode, wParam, lParam)
 
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.