PostMessage и TreeView. Управление.
От: Lucky_7  
Дата: 28.03.05 15:12
Оценка:
Категорически всех приветствую.


Есть вопрос(скорее всего вы сочтёте его некорректным, но всё же): можно ли с помощью PostMessage и SendMessage на окне чужой программы перемещаться по элементам TreeView? (эмулировать нажатие на плюсики:D )

29.03.05 07:24: Перенесено модератором из 'C/C++' — Odi$$ey
Re: PostMessage и TreeView. Управление.
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 28.03.05 15:26
Оценка:
Здравствуйте, Lucky_7, Вы писали:


L_>Есть вопрос(скорее всего вы сочтёте его некорректным, но всё же): можно ли с помощью PostMessage и SendMessage на окне чужой программы перемещаться по элементам TreeView? (эмулировать нажатие на плюсики:D )


Ответ на ваш вопрос: можно. Ответ на вопрос "как?" (выдрал кусочек из проекта):

BOOL WINAPI HighlightKeyInRegedit(HKEY hRootKey, LPCTSTR lpSubKey, LPCTSTR lpValueName)
{
  static HKEY hRootKeys[] =
  {
   HKEY_CLASSES_ROOT,
   HKEY_CURRENT_USER,
   HKEY_LOCAL_MACHINE,
   HKEY_USERS,
   HKEY_PERFORMANCE_DATA,
   HKEY_CURRENT_CONFIG,
   HKEY_DYN_DATA,
   (HKEY)-1
  };

  const char* key_names[] =
  {
   "HKEY_CL",
   "HKEY_CU",
   "HKEY_L",
   "HKEY_U",
   "HKEY_P",
   "HKEY_CURRENT_C",
   "HKEY_D"
  };

  const char* strRootKey = NULL;
  int i=0;
  while(hRootKeys[i] != (HKEY)-1)
  {
    if(hRootKey == hRootKeys[i])
    {
      strRootKey = key_names[i];
      break;
    }
    i++;
  } // while

  assert(strRootKey);

  HWND hRegedit = OpenRegedit();

  if(!hRegedit)
    return FALSE;

  ShowWindow(hRegedit,SW_MAXIMIZE);
  SetForegroundWindow(hRegedit);

  HWND hTreeView = FindWindowEx(hRegedit,NULL,"SysTreeView32",NULL);

  assert(hTreeView);


/*
// Close it up
    for ( int pos = 0; pos < 30; ++pos )
     {
      SendMessage( hTreeView, WM_KEYDOWN, VK_LEFT, 0 );
     }

 // Sleep(100);
*/
  SendMessage(hTreeView,WM_KEYDOWN,VK_HOME,0);

 //  SendMessage( hTreeView, WM_KEYDOWN, VK_RIGHT, 0 );
   Sleep(100);
 //  SendMessage(hTreeView,WM_CHAR,*strRootKey,0);

  for(; *strRootKey; ++strRootKey)
    SendMessage(hTreeView,WM_CHAR,*strRootKey,0);

 if(lpSubKey)
 {
   if(*lpSubKey != '\\')
    SendMessage(hTreeView,WM_KEYDOWN,VK_RIGHT,0);

   for(; *lpSubKey; ++lpSubKey)
   {
    if(*lpSubKey=='\\')
      SendMessage(hTreeView,WM_KEYDOWN,VK_RIGHT,0);
    else
     SendMessage(hTreeView,WM_CHAR,toupper(*lpSubKey),0);
   } // for

 } // if(lpSubKey)


  if(lpValueName && *lpValueName)
  {
  HWND hListView = FindWindowEx(hRegedit,NULL,"SysListView32",NULL);
  assert(hListView);

  DWORD dwThreadID = GetWindowThreadProcessId(hListView,NULL);
  AttachThreadInput(GetCurrentThreadId(),dwThreadID,TRUE);

  Sleep(100);
  SendMessage(hListView,WM_KEYDOWN,VK_HOME,0);


  while(1)
  {
  HWND hFocus = GetFocus();

   if(!hFocus || hFocus == hListView)
    break;

  ::SetFocus(hListView);
    Sleep(10);
  } //while

  for(; *lpValueName; ++lpValueName)
    SendMessage(hListView,WM_CHAR,toupper(*lpValueName),0);

  AttachThreadInput(GetCurrentThreadId(),dwThreadID,FALSE);
  } // if(lpValueName)

  return TRUE;
}
//---------------------------------------------------------------------------
Re[2]: PostMessage и TreeView. Управление.
От: nzeemin Россия http://nzeemin.livejournal.com/
Дата: 30.05.05 18:40
Оценка:
Здравствуйте, Flamer, Вы писали:

F> SendMessage(hListView,WM_KEYDOWN,VK_HOME,0);


Насчет SendMessage + WM_KEYDOWN.
Чен пишет что это как раз неправильный способ, правильный — через SendInput:
http://blogs.msdn.com/oldnewthing/archive/2005/05/30/423202.aspx
Re[3]: PostMessage и TreeView. Управление.
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 30.05.05 22:52
Оценка:
Здравствуйте, nzeemin, Вы писали:

N>Здравствуйте, Flamer, Вы писали:


F>> SendMessage(hListView,WM_KEYDOWN,VK_HOME,0);


N>Насчет SendMessage + WM_KEYDOWN.

N>Чен пишет что это как раз неправильный способ, правильный — через SendInput:
N>http://blogs.msdn.com/oldnewthing/archive/2005/05/30/423202.aspx

Да пжалста, я совсем не против, просто как обычно, для старой и дохлой (скорей бы она уже совсем подохла) Win95 (да и на WinNT 4.0 без третьего сервис-пака) SendInput не идет. Впрочем, это уже неактуально. Ну или почти неактуально.
... << RSDN@Home 1.1.4 beta 7 rev. 452>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.