Witam.
Pytanie do kAzka tak się chyba odmienia ;)), ale może ktoś jeszcze będzie widział. Napisałem sobie
taki moduł, o kodzie poniżej i on działa. wyświetla baloniki bez XPManifestu oraz - na czym mi także
zależało, w dowolnym punkcie ekranu. Na google jest wiele kodów, ale albo działając tylko dla tych
kontrolek, ktore dziedziczą po TCustomEdit albo jeżeli się już pojawia dymek pod przyciskiem to nie
pokzuje się na dlugo tylo zznika po poruszeniu kursorem. I stąd pytanie - czy da się prościej zrobić
to co poniżej? Bo jak widac nie umiejąc inaczej wykombinować chowania się balonika po czasie, to
wysyłam do apamiętanym w zmiennej gloalnej uchwycie TTM_TRACKACTIVATE z parametrem False
oraz jak widać mment kliknięcia na dymek przechytuje Hookiem na mtszkę, bo nie wiem w jaki inny
sposób można wykryć komunikat kliknięcia myszki. Taki balonik chyba nie posiada WndPRoc. Jeżeli
ktoś może to prosiłbym o wskazówki. Tak - wiem, kod niżej przekombinowany, ale jako tako działa.
unit balloontip;
interface
uses
Windows, Messages, Classes, CommCtrl;
var
WM_BALLOONTIPCLICKED : Word;
procedure ShowBalloonHint(Point : TPoint; Handle : HWND;
ATitle : string; AMessage : string; WhichIcon : Byte; PauseTime : Word);
procedure HideBalloonTip;
implementation
type
TPauseThread = class(TThread)
protected
procedure Execute; override;
end;
var
TempH : HWND;
APause : Word;
Thr : TThread;
OldPos : TPoint;
MouseHook : integer;
MessageBuffer : TEventMsg;
procedure TPauseThread.Execute;
begin
Sleep(APause);
HideBalloonTip;
end;
function MouseHookProc(Code : integer; wParam, lParam : Longint) : Longint; stdcall;
var
WinH : HWND;
MouseCord : TPoint;
begin
Result := 0;
case Code of
HC_ACTION :
begin
GetCursorPos(MouseCord);
if APause = 0 then
begin
if (MouseCord.X <> OldPos.X)
or (MouseCord.Y <> OldPos.Y) then
begin
APause := GetDoubleClickTime;
Thr := TPauseThread.Create(False);
end;
end;
MessageBuffer := PEventMsg(lParam)^;
if (MessageBuffer.Message = WM_LBUTTONDOWN)
or (MessageBuffer.Message = WM_MBUTTONDOWN)
or (MessageBuffer.Message = WM_RBUTTONDOWN) then
begin
WinH := WindowFromPoint(MouseCord);
if (TempH > 0) and (WinH = TempH) then
begin
SendMessage(HWND_BROADCAST, WM_BALLOONTIPCLICKED, 0, 0);
HideBalloonTip;
end;
Result := -1;
end;
end;
else
Result := CallNextHookEx(MouseHook, Code, wParam, lParam);
end;
end;
procedure ShowBalloonHint(Point : TPoint; Handle : HWND;
ATitle : string; AMessage : string; WhichIcon : Byte; PauseTime : Word);
const
TTS_BALLOON = $40;
var
Rect : TRect;
TI : TToolInfo;
TipHandle : HWND;
procedure SetToolTipTitle(TT : HWND; IconType : integer; Title : string);
var
Buffer : array[0..255] of Char;
const
TTM_SETTITLE = (WM_USER + 32);
begin
FillChar(Buffer, SizeOf(Buffer), #0);
LStrcpy(Buffer, PChar(Title));
SendMessage(TT, TTM_SETTITLE, IconType, Integer(@Buffer));
end;
begin
if TempH > 0 then
begin
HideBalloonTip;
end;
TipHandle := CreateWindowEx(0, TOOLTIPS_CLASS, nil,
TTS_ALWAYSTIP or TTS_BALLOON,
0, 0, 0, 0, Handle, 0, Handle, nil);
SetWindowPos(TipHandle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
GetClientRect(Handle, Rect);
with TI do
begin
cbSize := SizeOf(TToolInfo);
uFlags := TTF_TRACK;
hwnd := Handle;
hInst := Handle;
uId := Handle;
lpszText := PChar(AMessage);
end;
TI.Rect.Left := Rect.Left;
TI.Rect.Top := Rect.Top;
TI.Rect.Right := Rect.Right;
TI.Rect.Bottom := Rect.Bottom;
SendMessage(TipHandle, TTM_ADDTOOL, 1, Integer(@TI));
if WhichIcon > 3 then
begin
WhiChIcon := 0;
end;
SetToolTipTitle(TipHandle, WhichIcon, ATitle);
SendMessage(TipHandle, TTM_TRACKPOSITION, 0, MakeLParam(Point.X, Point.Y));
SendMessage(TipHandle, TTM_TRACKACTIVATE, Integer(True), Integer(@TI));
TempH := TipHandle;
APause := PauseTime;
GetCursorPos(OldPos);
MouseHook := SetWindowsHookEx(WH_JOURNALRECORD, MouseHookProc, HInstance, 0);
if PauseTime > 0 then
begin
Thr := TPauseThread.Create(False);
end;
end;
procedure HideBalloonTip;
begin
if TempH > 0 then
begin
UnHookWindowsHookEx(MouseHook);
SendMessage(TempH, TTM_TRACKACTIVATE, Integer(False), 0);
TempH := 0;
APause := 0;
if Thr <> nil then
begin
Thr.Suspend;
Thr := nil;
end;
end;
end;
initialization
WM_BALLOONTIPCLICKED := RegisterWindowMessage('MouseClickedOnTheBalloonTip');
end.