Điều khiển hiển thị Msgbox?

Liên hệ QC

sealand

Thành viên gạo cội
Tham gia
16/5/08
Bài viết
4,883
Được thích
7,688
Giới tính
Nam
Nghề nghiệp
Kế Toán
Mình muốn khi thực hiện lệnh hoặc hàm Msgbox thì cửa sổ thông báo hiện tại 1 vị trí xác định trước chứ không phải ở giữa màn hình như mặc định. Việc này có làm được không, các bạn hướng dẫn giúp.
 
Mình có cách chuối thế này, góp vui tẹo thôi nha!

Để xem thông tin địa chỉ mà bạn đã chọn/kích hoạt

PHP:
   Dim Temp
   Temp = InputBox(Selection.Address, "GPE", "GPE", 105 *  _
            Selection.Row, 205 * Selection.Column)
 
Upvote 0
Cám ơn bạn. Mình cần điều khiển cái của sổ của Msgbox cơ chứ không phải của Inputbox.
 
Upvote 0
Có lẽ là không làm được nhưng tôi cũng đề xuất 1 cách củ chuối nữa là: Tạo 1 form giả lập Msgbox, trên đó thiết lập các thông số để truyền vào khi gọi form. Như vậy ta có thể điều khiển được vị trí của nó.
 
Upvote 0
Mình muốn khi thực hiện lệnh hoặc hàm Msgbox thì cửa sổ thông báo hiện tại 1 vị trí xác định trước chứ không phải ở giữa màn hình như mặc định. Việc này có làm được không, các bạn hướng dẫn giúp.

Tất cả những gì nằm ngoài khả năng ban đầu đều có thể làm được nhưng với APIs cùng với 1 số kỹ thuật chuẩn của Windows Programming như Hook, Subclass,.... Mọi người đã thử Google chưa?

Google: Msgbox + Position + Visual Basic

Ra ngay bài đầu tiên của Microsoft

Tạo 1 form giả lập Msgbox

Cách này ko chuyên nghiệp, ngoài ra còn làm mất focus trên form chính khi show form mới (là sự khác biệt chính so với Msgbox chuẩn của Windows). Lại là 1 vấn đề mà chỉ có ai từng học/làm Windows Programming mới hiểu (sau này đa phần các programmers sẽ ko hề biết tới những thứ đó sau khi .NET ra đời) :-=
 
Lần chỉnh sửa cuối:
Upvote 0
Mình muốn khi thực hiện lệnh hoặc hàm Msgbox thì cửa sổ thông báo hiện tại 1 vị trí xác định trước chứ không phải ở giữa màn hình như mặc định. Việc này có làm được không, các bạn hướng dẫn giúp.
Anh ơi! Đúng như Hai2hai nói, món này cần đến hàm API đấy!
Nhưng có điều xem code xong lạnh cả người!
Anh tham khảo nha!
Define a Position of MessageBox using VBA in Excel
Em test thử thấy OK
Hic...
 
Upvote 0
Anh ơi! Đúng như Hai2hai nói, món này cần đến hàm API đấy!
Nhưng có điều xem code xong lạnh cả người!
Anh tham khảo nha!
Define a Position of MessageBox using VBA in Excel
Em test thử thấy OK
Hic...

Em thấy không cái gì là không thể học được cả. Cần có đam mê, đầu tư thời gian, điều kiện về tư liệu thời đại này có lẽ không thiếu. Thấy anh em trên GPE rất sáng tạo, nghiền ngẫm công thức & VBA, nhưng khi nói tới Windows API là đa số ngại bàn đến:-=. Cần chịu đổi mới nữa.
 
Upvote 0
Qua ý kiến các bạn, mình đã mường tượng con đường tới "Vườn đào" bao xa.
Đúng như TUAN VNUNI nói thực sự bọn mình ớn mấy cái API, class module thực sự khó ngấm. Mình do việc học hành manh mún nên kiến thức cũng hạn hẹp. Nhưng qua thực tế, mình thấy nó thực hay. Nó giúp ta can thiệp sâu hơn, thuần phục Wind, Off tốt hơn và đặc biệt nhanh tiện như khi có khách đột xuất mà quanh nhà bán đủ thức ăn sẵn.
Mong các chuyên gia lưu tâm chỉ giáo, anh em nhiệt tình học tập lo chi mặt bằng kiến thức của GPE không nâng thêm tầm cao mới.
Cũng xin cám ơn các bạn chỉ dẫn, mình cố gắng áp dụng và tìm để hiểu cái vụ Msgbox xem sao.
 
Upvote 0
Em thấy không cái gì là không thể học được cả. Cần có đam mê, đầu tư thời gian, điều kiện về tư liệu thời đại này có lẽ không thiếu. Thấy anh em trên GPE rất sáng tạo, nghiền ngẫm công thức & VBA, nhưng khi nói tới Windows API là đa số ngại bàn đến:-=. Cần chịu đổi mới nữa.
Ah... tôi thì chẳng ngại gì cả! Có điều cái gì cũng phải từ từ... nó mới thấm lâu!
Dù là VBA hay API thì cũng phải có những bước tập tành (như sư phụ SA_DQ, sư phụ Ptm0412 thầy Hướng đã làm qua các bài hướng dẩn cơ bản)
Theo tôi, biết nhiều không ngon bằng... biết chắc cú ---> Biết là áp dụng được ngay.. chứ đọc 1 đóng code kia thì... Ẹc... Ẹc... từ từ đại ca ơi (hỏng bị ngộp mới lạ)
 
Upvote 0
Anh ơi! Đúng như Hai2hai nói, món này cần đến hàm API đấy!
Nhưng có điều xem code xong lạnh cả người!
Anh tham khảo nha!
Define a Position of MessageBox using VBA in Excel
Em test thử thấy OK
Hic...
Bạn làm thế nào mà OK, tôi test thử thì thấy cái Msgbox vẫn đững nguyên vị trí giữa màn hình còn, cái của sổ của Excel lại bị dịch xuống theo tọa độ nhập vào.
 
Upvote 0
Bạn làm thế nào mà OK, tôi test thử thì thấy cái Msgbox vẫn đững nguyên vị trí giữa màn hình còn, cái của sổ của Excel lại bị dịch xuống theo tọa độ nhập vào.
Trong sub này:
PHP:
Sub TestMsgBox()
    MsgBoxPos "Set non-Center Position", _
              vbOKOnly, _
              "Message Box Hooking", _
              400, 300
End Sub
Hãy thay số 400, 300 thành số khác xem!
Tôi test đâu có vụ cửa sổ Excel bị dịch chuyển chứ!
 

File đính kèm

  • Test.xls
    24 KB · Đọc: 30
Lần chỉnh sửa cuối:
Upvote 0
Hình như nó làm mất điều khiển màn hình. Thu nhỏ cửa sổ Excel, thanh menu nhảy lung tung, không dời cửa sổ được dù đã tắt Msgbox. Các bạn có bị thế không ?.
 
Upvote 0
Mình test tốt mà, không bị dính các hiện tượng như các bạn mô tả. (Mình load File các bạn kiểm tra xem)
 

File đính kèm

  • Di chuyen MsgBox.xls
    29.5 KB · Đọc: 25
Lần chỉnh sửa cuối:
Upvote 0
Hình như nó làm mất điều khiển màn hình. Thu nhỏ cửa sổ Excel, thanh menu nhảy lung tung, không dời cửa sổ được dù đã tắt Msgbox. Các bạn có bị thế không ?.
Có lẽ anh nhập sô thế nào đó vượt khả năng tính toán của Windows mới có hiện tượng này... chứ em test có vấn đề gì đâu!
 
Upvote 0
Lạ nhỉ, nếu bấm trực tiếp vào button trên sheet của ndu thì OK nhưng nếu vào trong module nhấn F5 thì y chang như phamduylong nói.
 
Upvote 0
Có lẽ anh nhập sô thế nào đó vượt khả năng tính toán của Windows mới có hiện tượng này... chứ em test có vấn đề gì đâu!
Không tính toán gì, chỉ thử TestMsgBox

MessageBox1_resize.jpg


Khi MessageBox tắt, hiện tượng trên vẫn còn. Phải thoát Excel

MessageBox2_resize.jpg
 
Upvote 0
Đúng rồi, tôi cũng bị y chang như hình trên, tức là vị trí của Msgbox vẫn nằm giữa màn hình, còn thằng Excel thì lại bị điều chỉnh.
Có lẽ là do trình tự nhận cửa sổ của mấy thằng API kia nên nó đã hook nhầm địa chỉ.
Nhưng theo tôi thì code trên vẫn là chuẩn và có thể dùng được vì thực tế thì ta chỉ cần nó chạy đúng khi thao tác trên Excel. button trên sheet, trên Form hay menu đều đúng.
 
Upvote 0
UniMsgBoxPos với Unicode

Code trên viết không chuẩn, không an toàn. Nó hook sự kiện MsgBox chỉ bằng điều kiện If lMsg = HCBT_ACTIVATE Then, nó hiểu bất kỳ một cửa sổ (Window) nào hoạt động (active) đều là cửa sổ của MsgBox-->Lỗi.

Tôi sửa lại code trên đảm bảo tối ưu:
+ Hook đúng cửa sổ MsgBox
+ Hỗ trợ Unicode
+ Giải phóng việc Hook trước đó an toàn.

Bổ sung thêm 3 hàm Windows API
Mã:
Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function MessageBox Lib "user32.dll" Alias "MessageBoxW" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long

Hàm GetClassName để kiểm tra loại của sổ.
Hàm MessageBox để thay thế MsgBox trong VBA-->Gải pháp cho Unicode.
Hàm GetActiveWindow để nhận điều khiển (Handle) của cửa sổ hiện thời.

Viết lại hàm MsgBoxHookProc
Mã:
Private Function MsgBoxHookProc(ByVal lMsg As Long, _
                                ByVal wParam As Long, _
                                ByVal lParam As Long) As Long
    If lMsg = HCBT_ACTIVATE Then[COLOR="SeaGreen"] 'Kiểm tra cửa sổ hoạt động[/COLOR]
        
[COLOR="SeaGreen"]        'Modified by Nguyen Duy Tuan
        'Begin checking class for MsgBox Window
        'wParam is the handle of Window[/COLOR]

        Dim cClsName As String [COLOR="SeaGreen"]'Nhận tên Class của cửa sổ[/COLOR]
        Dim x As Long [COLOR="SeaGreen"]'Xác định số ký tự của chỗi[/COLOR]
        
        cClsName = Space(32)
        x = GetClassName(wParam, cClsName, 32)
        cClsName = Left(cClsName, x) [COLOR="SeaGreen"]'string convertion[/COLOR]
        
        If cClsName = "#32770" Then [COLOR="SeaGreen"]'Kiểm tra Class có phải của cửa sổ MsgBox không[/COLOR]
           
           [COLOR="SeaGreen"]' Change position[/COLOR]
           SetWindowPos wParam, 0, msgbox_x, msgbox_y, _
                        0, 0, SWP_NOSIZE + SWP_NOZORDER
    
           [COLOR="SeaGreen"]' Release the Hook[/COLOR]
           UnhookWindowsHookEx hHook
           hHook = 0
           MsgBoxHookProc = True
        End If
    End If
 
    MsgBoxHookProc = False
End Function
 

File đính kèm

  • UniMsgBoxPos.zip
    12.2 KB · Đọc: 89
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Tuan VNUNI nhé, đúng là xin 1 được 2.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom