![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EnumThreadWindows [D6, XP]
Pasha L © (2005-11-02 19:49:00)Простите за наглость. Кто-нибудь. Объясните на примере, как пользоваться EnumThreadWindows
GuAV (2005-11-03 10:35:00) [1]Во первых,
> BOOL CALLBACKEnumProc(
Т.е. нужно объявить эту функцию с директивой stdcall
Во вторых,
> : Boolean;
Это неверно, т.к. в оригинальном объявлении использован тип BOOL, имеющий размер 4 байта, а у Boolean - 1 байт. Ошибка скорее может проявится при возвращении значения False и то не всегда, но тем не мениее это ошибка.
При точном переводе объявление выглядит так:
function EnumProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
Однако я бы объявлял так:
function EnumProc(wnd: HWND; Param: LPARAM): DWORD; stdcall;
и возвращал бы 1 заместо true, 0 заместо false.
Это связано с тем, что в некоторых callback функциях идёт проверка на равенство сишному TRUE, которое равно 1, а не на любое ненулевое значение.
Pasha L (2005-11-03 00:42:00) [2]в чем они заключаются?
GuAV (2005-11-03 00:19:00) [3]Zeqfreed © (02.11.05 23:57) [3]
> Вот мой вариант :)
Он, кстати, с ошибками.
Pasha L (2005-11-03 00:18:00) [4]Спасибо большое
Zeqfreed (2005-11-02 23:57:00) [5]Pasha L © (02.11.05 23:05) [2]
> И что это вы мне написали
Вам написали пример использования, насколько я понимаю..
function EnumProc(wnd : HWND; lParam : Cardinal) : Boolean;
begin
Form1.Memo1.Lines.Add(IntToStr(wnd));
Result := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
EnumThreadWindows(GetWindowThreadProcessId(HWND_DESKTOP), @EnumProc, 0);
end;
Вот мой вариант :)
Pasha L (2005-11-02 23:05:00) [6]И что это вы мне написали
Fay (2005-11-02 20:17:00) [7]BOOL CALLBACK EnumProc(
HWND hwnd,
LPARAM lParam)
{
// Send a WM_CLOSE to destroy the window, because DestroyWindow
// does not work across threads.
SendMessage(hwnd, WM_CLOSE, 0, 0);
return TRUE;
}
BOOL ConsoleCtrlHandler(
DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_LOGOFF_EVENT && dwGuiThreadId != 0)
{
SetThreadDesktop(GetThreadDesktop(dwGuiThreadId));
EnumThreadWindows(dwGuiThreadId, EnumProc, 0);
}
return FALSE;
}