Отговорът на въпрос номер 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.
Така че какъв е проблемът?
Числото не може да има един бутон?