![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какая-то путаница с окнами. [D7, XP]
Новичек © (2009-02-22 16:44:00)Имеется вызов функции Enumchildwindows(hMDI, @EnumChildWindowsProc, 0);
Код функции EnumChildWindowsProc:
hWND := FindWindowEx(hMDI, 0, nil, Buffer);
windows.SetForegroundWindow(hWND);
ShowWindow(hWND, SW_NORMAL);
Sleep(500);
Application.ProcessMessages;
Sleep(500);
SendCtrY;//посылаю Ctrl+Y
Sleep(500);
Application.ProcessMessages;
SendCtrEnd;//посылаю Ctrl+End
Sleep(500);
Application.ProcessMessages;
SendKeys('list' + #13#10);//посылаю команду list
Sleep(500);
Application.ProcessMessages;
Result := True;
Вспомогательные фунции:
procedure SendKeys(buffer: string);
var
i: integer;
w: word;
D: DWORD;
P: ^DWORD;
begin
P := @D;
SystemParametersInfo(//get flashing timeout on win98
SPI_GETFOREGROUNDLOCKTIMEOUT,
0,
P,
0);
for i := 1 to length(buffer) do
begin
w := VkKeyScan(buffer[i]);
keybd_event(w, 0, 0, 0);
keybd_event(w, 0, KEYEVENTF_KEYUP, 0);
end;
SystemParametersInfo(//set flashing TimeOut=0
SPI_SETFOREGROUNDLOCKTIMEOUT,
0,
nil,
0);
SetForegroundWindow(hInput);
//->typecast working...
SystemParametersInfo(//set flashing TimeOut=previous value
SPI_SETFOREGROUNDLOCKTIMEOUT,
D,
nil,
0);
end;
procedure SendCtrY;
var
KeyInputs: array of TInput;
KeyInputCount: Integer;
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
Inc(KeyInputCount);
SetLength(KeyInputs, KeyInputCount);
KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
with KeyInputs[KeyInputCount - 1].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := KEYEVENTF_EXTENDEDKEY;
dwFlags := Flags or dwFlags;
time := 0;
dwExtraInfo := 0;
end;
end;
begin
KeyInputCount:=0;
KeybdInput(VK_CONTROL, 0); // Ctrl
KeybdInput(Byte('Y'), 0); // Y
KeybdInput(Byte('Y'), KEYEVENTF_KEYUP); //
KeybdInput(VK_CONTROL, KEYEVENTF_KEYUP); //
SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;
procedure SendCtrEnd;
var
KeyInputs: array of TInput;
KeyInputCount: Integer;
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
Inc(KeyInputCount);
SetLength(KeyInputs, KeyInputCount);
KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
with KeyInputs[KeyInputCount - 1].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := KEYEVENTF_EXTENDEDKEY;
dwFlags := Flags or dwFlags;
time := 0;
dwExtraInfo := 0;
end;
end;
begin
KeyInputCount:=0;
KeybdInput(VK_CONTROL, 0); // Ctrl
KeybdInput(VK_END, 0); // Y
KeybdInput(VK_END, KEYEVENTF_KEYUP); //
KeybdInput(VK_CONTROL, KEYEVENTF_KEYUP); //
SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;
Проблема в том, что без Slip'ов строки передаются в окна, как Бог на душу положит - могут передаться, не передаться, передаться с ошибкой.
Уважаемые Мастера, не знает ли кто - а почему, собственно?
Спасибо.
Сергей М. (2009-02-22 17:38:00) [1]
> Новичек
Задача колбэк-функции - получить хэндл, быстроположить его куда-нибудь куда ей скажут, например, в некий результирующий список, и быстроже вернуть управление.
А основную работу с результирующим списком следует осуществлять после возврата из Enumchildwindows.
Новичек (2009-02-22 17:36:00) [2]Спасибо :)
Сергей М. (2009-02-22 17:33:00) [3]Угу.
- Нате вам масло..
- Не, мне масло не надо, я хочу масло !
))
Новичек (2009-02-22 17:27:00) [4]Ну да, действительно - масло масляное :)
Новичек (2009-02-22 17:22:00) [5]Хм... Чего-то я напартачил... Сейчас разберусь.
Сергей М. (2009-02-22 17:06:00) [6]
> Вот здесь
Это чеготы делаешь в этой строчке ?!
Какое еще окно ты собрался искать, если параметром hWnd тебе ужепередан хэндл очередного перечисляемого окна в списке существующих окон, родителем которых является окно hMdШ ?
Новичек (2009-02-22 17:03:00) [7]Вот здесь: hWND := FindWindowEx(hMDI, 0, nil, Buffer);
Сергей М. (2009-02-22 16:56:00) [8]Ужас какой ...
А где собственно ты используешь значение хэндла окна, передаваемое тебе параметром в твою колбэк-функцию EnumChildWindowsProc ?