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


Автор: TeeT 10.5.2006, 15:35
.....

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);
} 

Автор: TeeT 19.5.2006, 11:59
Она до сих пор не работает !-)  smile   smile  

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

это плохо...

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

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

Автор: TeeT 27.5.2006, 16:04
Дело в том, что суда:
Код

  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 

Автор: Damarus 28.5.2006, 08:11
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.
 

Автор: TeeT 28.5.2006, 12:10
Damarus у меня тоже есть Хэлп по API, но то что там пишут не всегда до конца - все равно остаётся какой нибудь нюанс. 
К сведенью: констаны которые я подставляю я брал функцией SetWindowsHook, то есть кодировка и формат в принципе должжны быть понятны. В HEX редакторе буквы довольно понятны 

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

А вообще, обьясни подробней, что ты хочеш сделать и что есть S_SAVE_EVENTMSG. 

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

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

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

Автор: Damarus 1.6.2006, 08:55
Цитата

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

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

Цитата

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

Странный подход smile. 

Автор: TeeT 3.6.2006, 16:29
Цитата(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  

Автор: Damarus 3.6.2006, 19:34
Цитата(TeeT)

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


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

Цитата(TeeT)

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


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

Цитата

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


Я уж думал на VB smile  

Автор: TeeT 5.6.2006, 12:10
Код

.....
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!!!! помоему я так спросил в начале 

Автор: Damarus 5.6.2006, 17:27
Цитата

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


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


PS. CallNextHookEx можно вызывать так:
Код
CallNextHookEx(0, nCode, wParam, lParam)
 

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