Tôi cần thực hiện một số thay đổi đối với TaskDialog trước khi nó được hiển thị cho người dùng. Nó khá đơn giản để sử dụng các cuộc gọi Windows API để làm việc với mỗi điều khiển trên hộp thoại. Tôi cần phải chắc chắn hơn nút mà tôi đã tìm thấy. Tôi đã có thể mong đợi để tìm một nơi mà tôi có thể đọc kết quả nút sẽ cung cấp cho nếu ép.Khi lặp qua các điều khiển trên biểu mẫu, làm cách nào tôi có thể xác định các nút cụ thể?
nói cách khác, nếu tôi nhấn một nút có thể gây ra giá trị trả về (trong Delphi, nó được gọi là kết quả phương thức) là 100, tôi đã dự kiến sẽ có một cuộc gọi API mà tôi có thể gọi để tìm hiểu "giá trị trả về" của nút sẽ là. Tôi chưa tìm thấy bất kỳ cuộc gọi nào như vậy.
Tôi không muốn dựa vào văn bản nút ..
Đây là những gì tôi có cho đến nay.
function EnumWindowsProcToFindDlgControls(hWindow: HWND; _param:LPARAM): BOOL; stdcall;
var
sClassName:string;
hBMP:THandle;
i:integer;
begin
SetLength(sClassName, MAX_PATH);
GetClassName(hWindow, PChar(sClassName), MAX_PATH);
SetLength(sClassName, StrLen(PChar(sClassName)));
if sClassName='Button' then
begin
// always 0...
i:=GetDlgCtrlID(hWindow);
if (i=100) or (i=102) then
begin
hBmp := LoadImage(HInstance, 'DISA', IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADTRANSPARENT);
SendMessage(hWindow, BM_SETIMAGE, WPARAM(IMAGE_BITMAP), LPARAM(hBmp));
end;
end;
// keep looking
Result:=true;
end;
procedure TForm2.TaskDialog1DialogConstructed(Sender: TObject);
begin
EnumChildWindows(TaskDialog1.Handle, @EnumWindowsProcToFindDlgControls, 0);
end;
Tôi nghi ngờ không hoàn toàn "đáng kính" khi làm những việc như thế này với hộp thoại.
Đây là ứng dụng Delphi 10 Win32 sử dụng thành phần VCL TTaskDialog của Delphi, đây là một tính năng bao quanh tính năng hộp thoại nhiệm vụ của Windows. trước khi nó được hiển thị, sự kiện OnConstructed kích hoạt, thực thi mã này.
Cảm ơn sự giúp đỡ của bạn!
Tôi không đọc mã của bạn, nhưng bạn có thể xác định các nút cụ thể bằng ID của họ. Bạn chỉ cần biết ID của các điều khiển bạn muốn thay đổi. –
Dường như ID luôn bằng 0 khi được xây dựng bởi thói quen hộp thoại nhiệm vụ trong cửa sổ. –
FWIW, bạn có thể thay thế 'SetLength (sClassName, StrLen (PChar (sClassName));' và mã tương tự bằng 'sClassName: = PChar (sClassName);'. Điều đó sẽ đạt được như vậy. –