Làm thế nào để không bị bôi đen (chọn) giá trị mặc định trong INPUTBOX ??? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hoi_joker

Thành viên mới
Tham gia
14/9/07
Bài viết
41
Được thích
17
Mình có đoạn code ví dụ

Mã:
Sub test()
   Dim i
       i = InputBox("Prompt", "Title", "abc")
       MsgBox i
End Sub
===> inputbox select.jpg

Phải làm như thế nào để khi chạy thì giá trị DEFAULT VALUE của inputbox không "bị" chọn như hình dưới (không bị bôi đen "abc" mà con chuột nháy sau chữ c). Mục đích là khi người dùng đánh vào luôn có mặc định "abc" ở đầu (không muốn dùng if hay các hàm xử lý chuỗi, kiểm tra điều kiện).
kết quả mong muốn ===> inputbox unselect.jpg

Có cách nào ví dụ như:
1) Dùng SendKeys "{RIGHT}" (True/False) khi inputbox hiện ra...
2) Xây dựng 1 hàm inputbox phù hợp với yêu cầu này...

...
Mong được mọi người giúp đỡ !
 
Đã là mặc định, thì mặc định nó đã như vậy rồi, trừ khi bạn bỏ đi giá trị mặc định để người nhập tự nhập vào thôi.
 
Upvote 0
Đã là mặc định, thì mặc định nó đã như vậy rồi, trừ khi bạn bỏ đi giá trị mặc định để người nhập tự nhập vào thôi.
Mình muốn can thiệp vào những cái "mặc định để hiểu rõ hơn về nó và phục vụ mục đích của mình thôi mà
VD trên mạng có người viết
Mã:
Private Sub Form_Load()
Timer1.Enabled = False
End Sub

Private Sub Command1_Click()
Timer1.Interval = 250
Timer1.Enabled = True
InputBox "no selection", "no sel", "default value"
End Sub

Private Sub Timer1_Timer()
Timer1.Enabled = False
SendKeys "{RIGHT}", False
End Sub

To test, create a form with: • Command button • Timer control, and use default names.
nguồn: http://stackoverflow.com/questions/3657547/vb6-make-default-response-in-inputbox-not-highlighted

làm sao để tạo/ sử dụng được Timer control như ví dụ trên
HELP ME.
 
Upvote 0
Mình muốn can thiệp vào những cái "mặc định để hiểu rõ hơn về nó và phục vụ mục đích của mình thôi mà
VD trên mạng có người viết
Mã:
Private Sub Form_Load()
Timer1.Enabled = False
End Sub

Private Sub Command1_Click()
Timer1.Interval = 250
Timer1.Enabled = True
InputBox "no selection", "no sel", "default value"
End Sub

Private Sub Timer1_Timer()
Timer1.Enabled = False
SendKeys "{RIGHT}", False
End Sub

To test, create a form with: • Command button • Timer control, and use default names.
nguồn: http://stackoverflow.com/questions/3657547/vb6-make-default-response-in-inputbox-not-highlighted

làm sao để tạo/ sử dụng được Timer control như ví dụ trên
HELP ME.

Vậy thì bạn thử như vầy xem:

Sub test()
Dim a As String
SendKeys "{RIGHT}", False
a = InputBox("Toi la tôi", "Hoang", "Trong Nghia")
End Sub
 
Upvote 0
Vậy thì bạn thử như vầy xem:

Sub test()
Dim a As String
SendKeys "{RIGHT}", False
a = InputBox("Toi la tôi", "Hoang", "Trong Nghia")
End Sub
Đúng là đơn giản thiệt. Có những cái để đạt được mục đích của mình phải tuỳ biến chứ chưa chắc mặc định đã hay, đúng ko? mình nghĩ ko nhất thiết phải để mặc định dù rằng mặc định sẽ phù hợp với số đông...
Many tks.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy thì bạn thử như vầy xem:

Sub test()
Dim a As String
SendKeys "{RIGHT}", False
a = InputBox("Toi la tôi", "Hoang", "Trong Nghia")
End Sub

Trường hợp thế này không đạt yêu cầu, vậy phải làm sao?

Mã:
Sub test()
Dim i
Application.Visible = False
    SendKeys "{RIGHT}", False
    i = InputBox("Prompt", "Title", "abc")
    MsgBox i
Application.Visible = True
End Sub

chắc chỉ còn cách xây dựng 1 hàm InputBox riêng? các bạn giúp mình nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Trường hợp thế này không đạt yêu cầu, vậy phải làm sao?

Mã:
Sub test()
Dim i
Application.Visible = False
    SendKeys "{RIGHT}", False
    i = InputBox("Prompt", "Title", "abc")
    MsgBox i
Application.Visible = True
End Sub

chắc chỉ còn cách xây dựng 1 hàm InputBox riêng? các bạn giúp mình nhé

Khi đã ẩn Application (Excel) thì đâu còn nhận SendKeys được nữa.
Tạm thời chữa cháy thì bạn đổi vị trí 2 dòng này cho nhau: Application.Visible = False sau
SendKeys "{RIGHT}", False

Còn nếu code dài hoặc nhiều inputbox thì chắc phải viết 1 hàm CUSTOM INPUTBOX không bôi đen giá trị Default value. Trình độ mình có hạn, để nghiên cứu tiếp và trả lời bạn nếu có thể ...
 
Upvote 0
Trường hợp thế này không đạt yêu cầu, vậy phải làm sao?

Mã:
Sub test()
Dim i
Application.Visible = False
    SendKeys "{RIGHT}", False
    i = InputBox("Prompt", "Title", "abc")
    MsgBox i
Application.Visible = True
End Sub

chắc chỉ còn cách xây dựng 1 hàm InputBox riêng? các bạn giúp mình nhé

Tôi xài Win7, office 2007, với cái code của bạn thì tôi vẫn chạy được và cũng chẳng có bôi đen gì cả!

Muốn hàm thì tôi có hàm cho bạn!

[GPECODE=vb]Function udfInputBox(ByVal Prompt As String, _
Optional ByVal Title As String, _
Optional ByVal DefaultValue As Variant) As Variant
SendKeys "{RIGHT}"
udfInputBox = InputBox(Prompt, Title, DefaultValue)
End Function
[/GPECODE]

Cách dùng như một InputBox:

Mã:
Sub test2()
    Dim i
    Application.Visible = False
        i = udfInputBox("Prompt", "Title", "Hoang Trong Nghia")
        MsgBox i
    Application.Visible = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Khi đã ẩn Application (Excel) thì đâu còn nhận SendKeys được nữa.
Tạm thời chữa cháy thì bạn đổi vị trí 2 dòng này cho nhau: Application.Visible = False sau
SendKeys "{RIGHT}", False

Còn nếu code dài hoặc nhiều inputbox thì chắc phải viết 1 hàm CUSTOM INPUTBOX không bôi đen giá trị Default value. Trình độ mình có hạn, để nghiên cứu tiếp và trả lời bạn nếu có thể ...

Cái vụ màu xanh này tôi mới biết đó nha! Ẩn Excel thì có liên quan gì đến SendKeys chứ!
 
Upvote 0
Cái vụ màu xanh này tôi mới biết đó nha! Ẩn Excel thì có liên quan gì đến SendKeys chứ!

Máy mình cài WIN7 32bit -Excel 2003 chạy vẫn bị bôi đen khi Application.Visible = False (kể cả dùng hàm udfinputbox của Nghĩa). Vậy có phải Excel 2003 có vấn đề ??? Bạn nào dùng Office 2003 test giùm?
Mình ít dùng SendKeys nên mình suy luận: Nếu cửa sổ Excel ẩn (không active) thì SendKeys tương tự như bấn phím trên bàn phím nó không tác động vào cửa sổ Excel (khi đó chỉ có inputbox xuất hiện thôi). Kiến thức còn hạn chế. Mong các bạn hướng dẫn ...
 
Lần chỉnh sửa cuối:
Upvote 0
Máy mình cài WIN7 32bit -Excel 2003 chạy vẫn bị bôi đen khi Application.Visible = False (kể cả dùng hàm udfinputbox của Nghĩa). Vậy có phải Excel 2003 có vấn đề ???
Mình ít dùng SendKeys nên mình suy luận: Nếu cửa sổ Excel ẩn (không active) thì SendKeys tương tự như bấn phím trên bàn phím nó không tác động vào cửa sổ Excel (khi đó chỉ có inputbox xuất hiện thôi). Kiến thức còn hạn chế. Mong các bạn hướng dẫn ...

Mình đã thử trên Excel 2003 và WinXP đây. Không bị như bạn nói. Vậy lý do gì mỗi máy mỗi khác nhau?
 
Upvote 0
@ Nghĩa: Bạn để thử trong Workbook_open() xem có bị bôi đen không?
Mã:
Private Sub Workbook_Open()
Dim i
Application.Visible = False
    SendKeys "{RIGHT}", False
    i = InputBox("Promt", "Title", "abc"))
    Msgbox i
Application.Visible = True
End Sub
Có cách nào khắc phục không?
 
Upvote 0
Phải làm như thế nào để khi chạy thì giá trị DEFAULT VALUE của inputbox không "bị" chọn như hình dưới (không bị bôi đen "abc" mà con chuột nháy sau chữ c). Mục đích là khi người dùng đánh vào luôn có mặc định "abc" ở đầu (không muốn dùng if hay các hàm xử lý chuỗi, kiểm tra điều kiện).
kết quả mong muốn ===>

Người test không bị bôi đen còn người khác test lại bị ---> Chẳng biết đâu mà lần
-----------
Hic... tôi thấy thôi thì bạn suy nghĩ hướng khác cho gon: Dẹp cha nó cái Default Value đi, cứ để Input trống, người dùng nhập vào bình thường, xong việc bạn xử lý kết quả bằng cách nối thêm thằng Default value gì đó vào kết quả cũng được vậy
Ví dụ:
- Bạn có Default Value là "ABC"
- Res = InputBox(.... gì gì đó...)
- Sau khi bấm OK, bạn thêm dòng code Res = "ABC" & Res
Vậy là xong!
Sendkey send cỏ gì cho mệt (mà thực chất ai thường xuyên viết code sẽ "kỵ" cái thằng Sendkey này lắm)
 
Upvote 0
Người test không bị bôi đen còn người khác test lại bị ---> Chẳng biết đâu mà lần
-----------
Sendkey send cỏ gì cho mệt (mà thực chất ai thường xuyên viết code sẽ "kỵ" cái thằng Sendkey này lắm)

Mình test thấy ko nhận SendKeys khi Ẩn Excel nên cũng muốn tìm hiểu sao lại thế?
@ các bạn: có thể cho 1 file ví dụ nếu Application.Visible = False mà Sendkeys vẫn dùng được với EXCEL không, nhiều trường hợp dùng Sendkeys sẽ rất tiện chứ
 
Lần chỉnh sửa cuối:
Upvote 0
Mình test thấy ko nhận SendKeys khi Ẩn Excel nên cũng muốn tìm hiểu sao lại thế?
@ các bạn: có thể cho 1 file ví dụ nếu Application.Visible = False mà Sendkeys vẫn dùng được với EXCEL không, nhiều trường hợp dùng Sendkeys sẽ rất tiện chứ

Tôi nói thiệt với bạn là tôi cũng bó tay với em Senkeys này (kể cả tôi dùng Application.SenKeys khác với SenKeys đấy nhé). Khi tôi không thực hiện quay phim màn hình thì dù có cho nó vào Workbook_Open hay dùng nút lệnh để gọi code cũng không bôi đen. Nhưng tôi quay phim thì nó lại bôi đen! Tôi bó tay rồi đó!
 
Upvote 0
Mã:
[B]SendKeys Warning[/B]
The SendKeys method simulates keystrokes that
you would manually input in the active window.
Use with caution, because it can have unexpected results.
[B][COLOR=#FF0033]WARNING[/COLOR]: You should only use the SendKeys Method if no other option is available,
because it can cause problems, if the wrong window is active when the code runs.[/B]
 You can read more about SendKeys on the Microsoft website: [URL="http://msdn.microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx"]SendKeys Method[/URL].
[URL="http://www.contextures.com/excelvbasendkeys.html"]
http://www.contextures.com/excelvbasendkeys.html[/URL]
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
[B]SendKeys Warning[/B]
The SendKeys method simulates keystrokes that
you would manually input in the active window.
Use with caution, because it can have unexpected results.
[B][COLOR=#FF0033]WARNING[/COLOR]: You should only use the SendKeys Method if no other option is available,
because it can cause problems, if the wrong window is active when the code runs.[/B]
 You can read more about SendKeys on the Microsoft website: [URL="http://msdn.microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx"]SendKeys Method[/URL].
[URL="http://www.contextures.com/excelvbasendkeys.html"]
http://www.contextures.com/excelvbasendkeys.html[/URL]

Chính vì thế mà khi quay phim màn hình nó chẳng hoạt động, nó "send" đi đâu đó chứ không send vô cái input. Mình không dùng quay phim màn hình, lấy máy đt ra quay luôn, ngay cả cửa sổ của nó cũng không hoạt động đúng, lúc được lúc không!
Tốt nhất người dùng tự "sendkeys right" cho rồi, cứ hiện lên thì bấm mũi tên bên phải là xong!

Cái quan trọng là code của mình có chạy nhanh hay không, có tiện ích hay không, chứ ba cái tiểu tiết này chả mất thời gian gì cả, chẳng đáng bận tâm!

[video=youtube_share;BkfdBlFxvv8]http://youtu.be/BkfdBlFxvv8[/video]
 
Upvote 0
Upvote 0
hihihihi, Tức là em được các Thầy các Sư phụ cho "ăn ngon" rồi, giờ em có nhu cầu "mặc đẹp" nữa thôi mà!

Đã có nhu cầu mặc đẹp, thì phải nên nghĩ rộng ra ngoài đồ "may sẵn" inputbox thế, "may sẵn" có ưu điểm của nó, nhưng nó vẫn là cái sẵn có theo ý nhà thiết kế ban đầu,

vậy hãy tự thiết kế riêng cho mình đi ứng dụng chuyên cho 1 yêu cầu nào đó

Gửi chủ topic,

Nếu có nhu cầu cần thiết như vậy (giúp nhập nhanh hơn - đỡ phải bực mình mỗi khi nhập), thì nên thiết kế form nhập (input) riêng cho mình, khi đó dùng textbox với giá trị khởi tạo là "abc" thì đạt yêu cầu của rùi
 
Upvote 0
Đã có nhu cầu mặc đẹp, thì phải nên nghĩ rộng ra ngoài đồ "may sẵn" inputbox thế, "may sẵn" có ưu điểm của nó, nhưng nó vẫn là cái sẵn có theo ý nhà thiết kế ban đầu,

Đồ may sẳn nếu lỡ mua mà không ưng ý, ta có thể chỉnh sửa lại đôi chút, nếu vẫn không vừa ý thì ta mới tính tự thiết kế kiểu khác, anh Bill đâu có khắc khe vấn đề ta chỉnh sửa "quần áo" do ảnh may sẳn đâu nè!
 
Upvote 0
Chính vì thế mà khi quay phim màn hình nó chẳng hoạt động, nó "send" đi đâu đó chứ không send vô cái input.

Bạn ngac nhiên à? Có chỗ nào nói là SendKeys "gửi" tới cửa sổ Excel? Nó giả nhấn key nào đó, và người được Windows thông báo: "này, có key được nhấn trong cửa sổ của ngươi đấy" chính là "vị" mà ở thời điểm đó đang Active.
Ví dụ bạn mở WORD và notepad. Nếu ở thời điểm SendKeys mà notepad đang active - vd. trước tiên code active notepad - thì notepad nhận được "tin vui" từ Windows. Nếu WORD đang active thì WORD nhận được tin vui.
Mà help của Excel cũng ghi rõ:

View attachment 101411

@ hoi_joker:
1. Bạn hãy trả lời bài #16 của ndu

2. Thay vì MsgBox i bạn hãy viết code cụ thể sau dòng i = InputBox("Promt", "Title", "abc"))
Tôi muốn xem bạn định xử lý kết quả như thế nào mà bạn cho rằng cái "bôi đen" kia nó lại làm khó dễ cho bạn.

3. Nếu cứ muốn bỏ bôi đen vì "tôi thích thế" (caprice) thì ...
À, ta ôn lại API một tí nhể?

module1:
Mã:
Sub test()
Dim i
    Application.Visible = False
    i = InputBoxNoSelect("Prompt", "Title", "abc")
    MsgBox i
    Application.Visible = True
End Sub

module2:
Mã:
Private Const WH_CBT As Long = 5
Private Const HCBT_ACTIVATE As Long = 5

Private Const EM_SETSEL As Long = &HB1
Private Const VK_RIGHT = 39
Private Const WM_KEYDOWN = &H100

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long

Public HookHandle As Long

Private Function CBTProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hEdit As Long, sClass As String, length As Long
    If code = HCBT_ACTIVATE Then
        sClass = String(255, Chr(0))
        length = GetClassName(wParam, sClass, 255)
        sClass = left(sClass, length)
        If sClass = "#32770" Then
            hEdit = FindWindowEx(wParam, 0, "Edit", vbNullString)
'            hoac gia nhan phim "mui ten phai"
'            SendMessage hEdit, WM_KEYDOWN, VK_RIGHT, 0
'            hoac
            SendMessage hEdit, EM_SETSEL, -1, 0
        End If
    End If
    
    CBTProc = CallNextHookEx(HookHandle, code, wParam, lParam)
End Function

Function InputBoxNoSelect(ByVal Prompt As String, Optional ByVal Title As String, Optional ByVal default As String, _
                    Optional ByVal xpos As Long, Optional ByVal ypos As Long, Optional HelpFile As String, _
                    Optional ByVal Context As Long) As Variant
    HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.Hinstance, GetCurrentThreadId)
    InputBoxNoSelect = InputBox(Prompt, Title, default, xpos, ypos, HelpFile, Context)
    UnhookWindowsHookEx (HookHandle)
End Function
 
Upvote 0
Bạn ngac nhiên à? Có chỗ nào nói là SendKeys "gửi" tới cửa sổ Excel? Nó giả nhấn key nào đó, và người được Windows thông báo: "này, có key được nhấn trong cửa sổ của ngươi đấy" chính là "vị" mà ở thời điểm đó đang Active.
Ví dụ bạn mở WORD và notepad. Nếu ở thời điểm SendKeys mà notepad đang active - vd. trước tiên code active notepad - thì notepad nhận được "tin vui" từ Windows. Nếu WORD đang active thì WORD nhận được tin vui.
Mà help của Excel cũng ghi rõ:

View attachment 101411

@ hoi_joker:
1. Bạn hãy trả lời bài #16 của ndu

2. Thay vì MsgBox i bạn hãy viết code cụ thể sau dòng i = InputBox("Promt", "Title", "abc"))
Tôi muốn xem bạn định xử lý kết quả như thế nào mà bạn cho rằng cái "bôi đen" kia nó lại làm khó dễ cho bạn.

3. Nếu cứ muốn bỏ bôi đen vì "tôi thích thế" (caprice) thì ...
À, ta ôn lại API một tí nhể?

module1:
Mã:
Sub test()
Dim i
    Application.Visible = False
    i = InputBoxNoSelect("Prompt", "Title", "abc")
    MsgBox i
    Application.Visible = True
End Sub

module2:
Mã:
Private Const WH_CBT As Long = 5
Private Const HCBT_ACTIVATE As Long = 5

Private Const EM_SETSEL As Long = &HB1
Private Const VK_RIGHT = 39
Private Const WM_KEYDOWN = &H100

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long

Public HookHandle As Long

Private Function CBTProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hEdit As Long, sClass As String, length As Long
    If code = HCBT_ACTIVATE Then
        sClass = String(255, Chr(0))
        length = GetClassName(wParam, sClass, 255)
        sClass = left(sClass, length)
        If sClass = "#32770" Then
            hEdit = FindWindowEx(wParam, 0, "Edit", vbNullString)
'            hoac gia nhan phim "mui ten phai"
'            SendMessage hEdit, WM_KEYDOWN, VK_RIGHT, 0
'            hoac
            SendMessage hEdit, EM_SETSEL, -1, 0
        End If
    End If
    
    CBTProc = CallNextHookEx(HookHandle, code, wParam, lParam)
End Function

Function InputBoxNoSelect(ByVal Prompt As String, Optional ByVal Title As String, Optional ByVal default As String, _
                    Optional ByVal xpos As Long, Optional ByVal ypos As Long, Optional HelpFile As String, _
                    Optional ByVal Context As Long) As Variant
    HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.Hinstance, GetCurrentThreadId)
    InputBoxNoSelect = InputBox(Prompt, Title, default, xpos, ypos, HelpFile, Context)
    UnhookWindowsHookEx (HookHandle)
End Function
Bạn cho mình hỏi phải sửa thế nào để hàm trên làm hiện Inputbox ở giữa màn hình như Inputbox thông thường không ạ?
 
Upvote 0
Bạn cho mình hỏi phải sửa thế nào để hàm trên làm hiện Inputbox ở giữa màn hình như Inputbox thông thường không ạ?

Thì ..... dùng chuột kéo vào!!!
-------------------------
Không có gì khó đối với siwtom, hên cho bạn là gặp được đại cao thủ rồi đó!.
Nhưng theo mình nghĩ đặt ra bài tập để làm cho vui thì đúng hơn chớ làm kiểu này để phục vụ công việc nhập số liệu, nếu ít sử dụng đến thì đúng là ... dày công quá!
 
Upvote 0
Thì ..... dùng chuột kéo vào!!!
-------------------------
Không có gì khó đối với siwtom, hên cho bạn là gặp được đại cao thủ rồi đó!.
Nhưng theo mình nghĩ đặt ra bài tập để làm cho vui thì đúng hơn chớ làm kiểu này để phục vụ công việc nhập số liệu, nếu ít sử dụng đến thì đúng là ... dày công quá!
Tôi ko biết ai là cao thủ với không cao thủ cả, tôi chỉ biết là nếu chưa biết thì phải học, phải hỏi thôi. Tôi cố gắng thay đổi 1 số thông số hàm API đó nhưng vẫn không được nên mới hỏi để được hướng dẫn.
Bạn có vẻ thích "tôn sùng" một vài người và làm rối vấn đề. Nếu đã có hàm API tương tự inputbox thì cũng có thể xác định được vị trí cái inputbox đó, đúng không? (chứ để nó xuất hiện rồi dùng chuột kéo thì... phí code)

@ hoi_joker: giải pháp tạo 1 Userform có 1 Textbox sẽ thích hợp với yêu cầu của bạn hơn.
 
Upvote 0
Bạn cho mình hỏi phải sửa thế nào để hàm trên làm hiện Inputbox ở giữa màn hình như Inputbox thông thường không ạ?

Code cũ:
Mã:
Function InputBoxNoSelect(ByVal Prompt As String, Optional ByVal Title As String, Optional ByVal default As String, _
                    Optional ByVal xpos As [COLOR="#0000FF"]Long[/COLOR], Optional ByVal ypos As [COLOR="#0000FF"]Long[/COLOR], Optional HelpFile As String, _
                    Optional ByVal Context As Long) As Variant
    HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.Hinstance, GetCurrentThreadId)
    InputBoxNoSelect = InputBox(Prompt, Title, default, xpos, ypos, HelpFile, Context)
    UnhookWindowsHookEx (HookHandle)
End Function

Nên đổi thành

Mã:
Function InputBoxNoSelect(ByVal Prompt As String, Optional ByVal Title As String, Optional ByVal default As String, _
                    Optional ByVal xpos As [COLOR="#FF0000"]Variant[/COLOR], Optional ByVal ypos As [COLOR="#FF0000"]Variant[/COLOR], Optional HelpFile As String, _
                    Optional ByVal Context As Long) As Variant
    HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.Hinstance, GetCurrentThreadId)
    InputBoxNoSelect = InputBox(Prompt, Title, default, xpos, ypos, HelpFile, Context)
    UnhookWindowsHookEx (HookHandle)
End Function

xpos, ypos với kiểu VARIANT (giống như khai báo gốc của InputBox) thì hàm InputBox sẽ xử lý đúng theo ý của nó.
 
Upvote 0
Msgbox Postition

Bạn cho mình hỏi phải sửa thế nào để hàm trên làm hiện Inputbox ở giữa màn hình như Inputbox thông thường không ạ?

Mình tìm được đoạn code này trên mạng (không nhớ trang nào), mọi người test thử
tất cả code trong module1
Mã:
Option Explicit

Private Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
 
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
 
Private Declare Function SetWindowsHookEx Lib "user32" _
    Alias "SetWindowsHookExA" _
    (ByVal idHook As Long, _
     ByVal lpfn As Long, _
     ByVal hmod As Long, _
     ByVal dwThreadId As Long) As Long
 
Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, _
     ByVal hWndInsertAfter As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal cx As Long, _
     ByVal cy As Long, _
     ByVal wFlags As Long) As Long
 
' Handle to the Hook procedure
Private hHook As Long
 
' Position
Private msgbox_x As Long
Private msgbox_y As Long
 
' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
 
' SetWindowPos Flags
Private Const SWP_NOSIZE = &H1      ' Retains the current size
Private Const SWP_NOZORDER = &H4    ' Retains the current Z order
 
[B]Public Sub MsgBoxPos[/B](strPromt As String, _
              vbButtons As VbMsgBoxStyle, _
              strTitle As String, _
              xPos As Long, _
              yPos As Long)
 
    ' Store position
    msgbox_x = xPos
    msgbox_y = yPos
 
    ' Set Hook
    hHook = SetWindowsHookEx(WH_CBT, _
                              AddressOf MsgBoxHookProc, _
                              0, _
                              GetCurrentThreadId)
 
    ' Run MessageBox
    MsgBox strPromt, vbButtons, strTitle
End Sub
 
Private Function MsgBoxHookProc(ByVal lMsg As Long, _
                                ByVal wParam As Long, _
                                ByVal lParam As Long) As Long
    If lMsg = HCBT_ACTIVATE Then
        ' Change position
        SetWindowPos wParam, 0, msgbox_x, msgbox_y, _
                     0, 0, SWP_NOSIZE + SWP_NOZORDER
 
        ' Release the Hook
        UnhookWindowsHookEx hHook
    End If
 
    MsgBoxHookProc = False
End Function


[B]'--------------------------------------------------------------------------------------
Sub TestMsgBox()[/B]
    MsgBoxPos "Set non-Center Position", _
              vbOKOnly, _
              "Message Box Hooking", _
              [B][COLOR=#ff0000]400, 300[/COLOR][/B]                    '<== thay đổi tùy vị trí xác định thủ công hoặc dùng hàm
End Sub
'--------------------------------------------------------------------------------------
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom