Отговорът на въпрос номер 48987

Аз съм всичко за създаване на икони в тавата.

Имам Windows XP

Въпрос: TolbarWindow32 - един клас в Делфи TToolbar. Но по някаква причина, когато се
Изпратя съобщение:
В същото време знам, че по-рано от основния си брой (т.е. икони) и
номер процедура TolbarWindow32.

Искам да знам координатите на един бутон (т.е. икони)

Var R: TRect;
започвам
SendMessage (TolbarWindow32, TB_GETITEMRECT, Брой, LongInt (@R));

но R.left, R.right - 0. Защо? Има ли друг начин да се получи координатите на един бутон (т.е., икони).

И начина, защото там са - например: той се използва от програми като Word, Exel, SOUNDMAN.EXE т.н.

Следвайте коментарите към този въпрос чрез RSS

Не заявка по-долу вижте по-долу, "Намерих координатите на един бутон - това е, което начин"
и "Или може би можете да намерите дръжката определен бутон".

// аз забравих за вида на съобщението.

Облигацията е наистина системната лента.

>>> аз съм всичко за създаване на икони в тавата
Каква е връзката между тази фраза и останалата част от въпроса. Искате ли да бъде третиран като системната лента Toolbar?

Или може би можете да намерите на дръжката и да получите определен бутон
координира помощта на GetWindowRect. Но как да се намери дръжката определен
бутон?


Координати бутони, които открих - това е, което по следния начин:

функционира ToolBarWindow32: HWnd;
започвам
Резултат: = FindWindow ( "Shell_TrayWnd", нула);
Резултати: = FindWindowEx (резултат 0 "TrayNotifyWnd" нула);
Резултати: = FindWindowEx (резултат 0 "SysPager" нула);
Резултати: = FindWindowEx (резултат 0 "ToolbarWindow32" нула);
приключи;

функция SysPager: HWnd;
започвам
Резултат: = FindWindow ( "Shell_TrayWnd", нула);
Резултати: = FindWindowEx (резултат 0 "TrayNotifyWnd" нула);
Резултати: = FindWindowEx (резултат 0 "SysPager" нула);
приключи;

функция GetRect: TRect;
Var
hProcess: THandle;
FAddr: Pointer;
FCount: Кардинал;
Fpid: DWORD;
започвам
GetWindowThreadProcessId (SysPager, Fpid);
hProcess: = OpenProcess (PROCESS_VM_READ или PROCESS_VM_OPERATION, фалшиво, Fpid);
FAddr: = VirtualAllocEx (hProcess, @ резултат SizeOf (резултат), MEM_COMMIT, PAGE_READWRITE);

// Тук пишете номера на ключа 6 - защото не знам как да се идентифицират
// бутон ми. Shell_NotifyIcon (NIM_ADD, @ FData). Ако някой знае
// информира.

<
можете да направите
SendMessage (ToolBarWindow32, TB_GETRECT, 6, lParam (FAddr));
>


ReadProcessMemory (hProcess, FAddr, @result, SizeOf (резултат), FCount);
VirtualFreeEx (hProcess, FAddr, SizeOf (резултат), MEM_RELEASE);
CloseHandle (hProcess);
приключи;

При изпращане на съобщения vvide

SendMessage (ToolBarWindow32, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG (p.left + 1, p.top + 1));
SendMessage (ToolBarWindow32, WM_LBUTTONUP, MK_LBUTTON, MAKELONG (p.left + 1, p.top + 1));

работи - и по този начин координатите отдясно, но координатите
огромен брой. Как да конвертирате Полученият kordinaty в kordinaty на
екран.

Е, не съвсем разбирам въпроса.

Първо, както се разбере, че е приемник TolbarWindow32 (.) TToolbar.
На второ място, което искате да получите най-прякото бутоните с номера на индекса.

В рамките на класа:
Извършете (TB_GETITEMRECT, Брой, LongInt (@R));

ако не, тогава трябва да знаете, клас на TolbarWindow32 прозорец дръжка.
SendMessage (_TolbarWindow32.Handle TB_GETITEMRECT, Брой, LongInt (@R).);
където _TolbarWindow32 греди клас TolbarWindow32.

Така че какъв е проблемът?
Числото не може да има един бутон?