Категорически всех приветствую.
Есть вопрос(скорее всего вы сочтёте его некорректным, но всё же): можно ли с помощью PostMessage и SendMessage на окне чужой программы перемещаться по элементам TreeView? (эмулировать нажатие на плюсики:D )
29.03.05 07:24: Перенесено модератором из 'C/C++' — Odi$$ey
Здравствуйте, 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;
}
//---------------------------------------------------------------------------
Здравствуйте, Flamer, Вы писали:
F> SendMessage(hListView,WM_KEYDOWN,VK_HOME,0);
Насчет SendMessage + WM_KEYDOWN.
Чен пишет что это как раз неправильный способ, правильный — через SendInput:
http://blogs.msdn.com/oldnewthing/archive/2005/05/30/423202.aspx
Здравствуйте, 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>>