Xin code: switch sang ứng dụng khác đang mở (2 người xem)

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

anhdepjai

Thành viên thường trực
Tham gia
16/6/10
Bài viết
387
Được thích
94
Chào các thầy cô và anh chị,

Em đang gặp vấn đề đối với việc chuyển đổi giữa các ứng dụng khác nhau đang mở. VD: em đang mở file excel, nhưng mà em phải sử dụng 1 ứng dụng khác để lấy thông tin (Acrobat reader - pdf chẳng hạn). và ứng dụng đó đang mở sẵn trên windows.
Sau đó cho em code để quay về file excel luôn ah.

Loay hoay mãi mà em chả biết làm thế nào, mong các thầy cô và anh chị hướng dẫn em với ah.

Em xin cảm ơn
 
Chào các thầy cô và anh chị,

Em đang gặp vấn đề đối với việc chuyển đổi giữa các ứng dụng khác nhau đang mở. VD: em đang mở file excel, nhưng mà em phải sử dụng 1 ứng dụng khác để lấy thông tin (Acrobat reader - pdf chẳng hạn). và ứng dụng đó đang mở sẵn trên windows.
Sau đó cho em code để quay về file excel luôn ah.

Loay hoay mãi mà em chả biết làm thế nào, mong các thầy cô và anh chị hướng dẫn em với ah.

Em xin cảm ơn

bạn muốn chuyển đổi các ứng dụng như khi mình ấn tổ hợp phím ALT + TAB ??
 
Upvote 0
Đúng rồi, mình đã thử code sendkeys nhưng lúc được lúc không. Chẳng biết có viết sai cấu trúc không nữa
Application.SendKeys "%" & "{TAB}", Application.SendKeys "%" + "{TAB}"
hoặc Application.SendKeys "%{TAB}" đều không được.
 
Upvote 0
Đúng rồi, mình đã thử code sendkeys nhưng lúc được lúc không. Chẳng biết có viết sai cấu trúc không nữa
Application.SendKeys "%" & "{TAB}", Application.SendKeys "%" + "{TAB}"
hoặc Application.SendKeys "%{TAB}" đều không được.

Nếu đặt vào tình huống này, tôi sẽ dùng các hàm API thay cho phương thức send keys
Ví dụ để chuyển qua lại giữa cửa sổ excel và cửa sổ notepad , tôi dùng cách sau:
* Đầu tiên bạn phải bật chương trình notepad lên
* Copy đoạn code này vào moude của Excel , ( lưu ý máy tôi dùng 64 bits nên các hàm API sẽ phải khai báo khác hệ điều hành 32 bits <--- bạn tự tìm hiểu để điều chính khai báo các hàm API)
Mã:
Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As Longptr) As Long
Public Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub GPE()
Static chk As Boolean
Dim hwnd
    hwnd = IIf(chk, FindWindow("Notepad", vbNullString), Application.hwnd)
    ShowWindow hwnd, 3
    BringWindowToTop hwnd
    chk = Not chk
End Sub
* chạy code trên bạn sẽ thây cửa sổ notepad và excel được chuyển đổi qua lại !
 
Upvote 0
Cảm ơn bạn trước nhé, để mình thử ngay đã. Thanks
 
Upvote 0
Mình khai báo không được bạn ah, toàn báo lỗi, Không biết khai báo như thế này có gì sai không nhỉ:
Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Kiểm tra giúp mình với nhé
Thanks
 
Upvote 0
Mình khai báo không được bạn ah, toàn báo lỗi, Không biết khai báo như thế này có gì sai không nhỉ:
Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Kiểm tra giúp mình với nhé
Thanks

Mã:
#If VBA7 Then
Private Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#Else
Private Declare  Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Private Declare  Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare  Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
 
Upvote 0
Hix, mình thử cài để tab sang ứng dụng đang chạy mà nó không được. Nếu notepad thì được nhưng các ứng dụng khác không biết để tên là gì. VD: google chrome hoặc acrobat reader
Bạn có thể hướng dẫn thêm không. Thanks
 
Upvote 0
Nếu đặt vào tình huống này, tôi sẽ dùng các hàm API thay cho phương thức send keys
Ví dụ để chuyển qua lại giữa cửa sổ excel và cửa sổ notepad , tôi dùng cách sau:
* Đầu tiên bạn phải bật chương trình notepad lên
* Copy đoạn code này vào moude của Excel , ( lưu ý máy tôi dùng 64 bits nên các hàm API sẽ phải khai báo khác hệ điều hành 32 bits <--- bạn tự tìm hiểu để điều chính khai báo các hàm API)
Mã:
Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal hwnd As Longptr) As Long
Public Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub GPE()
Static chk As Boolean
Dim hwnd
    hwnd = IIf(chk, FindWindow("[COLOR=#ff0000]Notepad[/COLOR]", vbNullString), Application.hwnd)
    ShowWindow hwnd, 3
    BringWindowToTop hwnd
    chk = Not chk
End Sub
* chạy code trên bạn sẽ thây cửa sổ notepad và excel được chuyển đổi qua lại !
Chỗ màu đỏ là ClassName, không phải ai cũng biết (kể cả người rành VBA cũng chưa chắc biết)
Tôi nghĩ xác định hWnd thông qua Window Caption sẽ dễ dùng hơn
 
Upvote 0
Thầy NDU hướng dẫn em với ah, Cái này em đang rất cần. Em cảm ơn thầy trước nhé.
Thanks
 
Upvote 0
Thầy NDU hướng dẫn em với ah, Cái này em đang rất cần. Em cảm ơn thầy trước nhé.
Thanks

Nếu là Windows XP thì viết dễ lắm, cửa sổ nó ra cửa sổ đàng hoàng. Còn bây giờ dùng Windows 7 (hoặc 8), cái cửa sổ dạng Ribbon nó khó nắm bắt quá (dù nhìn thấy cái caption nhưng chưa chắc nó làm caption)... Rồi đôi khi có vụ cửa sổ con nằm trong cửa sổ mẹ gì gì đó, phiền phức vô cùng
-----------------------------
Khi tham gia gửi bài vào topic này, tôi cũng nghiên cứu nhưng nói thật là... chưa đi đến đâu
(dù gì thì tôi cũng thuộc dạng "lơ tơ mơ" đối với mấy hàm API, biết chút ít chẳng thấm vào đâu cả)
 
Upvote 0
Thầy ah,Trong trường hợp của em là máy dùng win 7. Trên máy chỉ bật 2 ứng dụng là excel và 1 ứng dụng khác (do bên công ty lập trình). Nhiệm vụ của em là làm sao chuyển rồi qua ứng dụng kia. sau đó em sẽ dùng hàm sendkeys để lấy dữ liệu chuyển về excel rồi in ra cái tem thành phẩm. Vậy sẽ không có cửa sổ con hay ribbon nào cả. mà chỉ là 2 cửa sổ chính thôi ah. Mong thầy và các bạn giúp em với
 
Upvote 0
Dear cả nhà, Em đã tìm được đoạn này để lấy classname: Nhưng khi lấy classname của phần mềm em định lấy thì không nó không tìm ra được. Trong khi các cửa sổ khác thì nó lại tìm ra được class name:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 Sub Form_Load()
Dim WinWnd As Long, Ret As String, RetVal As Long, lpClassName As String
'Ask for a Window title
Ret = InputBox("Enter the exact window title:" + Chr$(13) + Chr$(10) + "Note: must be an exact match")
'Search the window
WinWnd = FindWindow(vbNullString, Ret)
If WinWnd = 0 Then MsgBox "Couldn't find the window ...": Exit Sub
'Create a buffer
lpClassName = Space(256)
'retrieve the class name
RetVal = GetClassName(WinWnd, lpClassName, 256)
'Show the classname
MsgBox "Classname: " + Left$(lpClassName, RetVal)
End Sub
Cái em cần tìm class name có tên title là: System HG ver 2.0 *** TOKYO ***@inventory List
Hy vọng ai đó có thể giúp em ah
 
Upvote 0
Dear cả nhà, Em đã tìm được đoạn này để lấy classname: Nhưng khi lấy classname của phần mềm em định lấy thì nó không tìm ra được. Trong khi các cửa sổ khác thì nó lại

Code của bạn tôi đã biết từ lâu rồi. Vấn đề là như tôi đã nói ở bài 12: Bạn nhìn thấy cái caption nhưng cũng chẳng làm được gì
(Tôi làm không được thôi nhưng các chuyên gia khác chắc thừa sức. Để chờ xem)
 
Upvote 0
Xin nói thêm: Code của tôi là thế này:
Mã:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowW" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameW" (ByVal hwnd As Long, ByVal lpClassName As Long, ByVal nMaxCount As Long) As Long
Function WinClassName(ByVal WinCap As String) As String
  Dim WinWnd As Long, RetVal As Long, lpClassName As String
  WinWnd = FindWindow(vbNullString, StrPtr(WinCap))
  If WinWnd <> 0 Then
    lpClassName = Space(256)
    RetVal = GetClassName(WinWnd, StrPtr(lpClassName), 256)
    WinClassName = Left$(lpClassName, RetVal)
  End If
End Function
Áp dụng: =WinClassName("Start - foxit reader") để tìm classname của chương trình Foxit Reader đang mở

Bạn kiểm tra lại kỹ lần nữa, nhiều khi cái title ấy có khoảng trắng ở đầu hoặc ở cuối cũng không chừng (tôi từng bị vụ khoảng trắng này và tìm lòi con mắt cũng không ra)
 
Upvote 0
Vâng, cảm ơn thầy. Em thử kiểm tra thêm ah :(. Nếu thầy có cách nào mong chỉ giáo em luôn ah
 
Upvote 0
Vâng, cảm ơn thầy. Em thử kiểm tra thêm ah :(. Nếu thầy có cách nào mong chỉ giáo em luôn ah

Tôi có thêm cách này:
Mã:
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Const GW_HWNDNEXT = 2
Function ClassName(Optional Caption As String = "*") As String
  Dim hWnd As Long
  Dim sTitle As String, sClass As String
  hWnd = FindWindow(vbNullString, vbNullString)
  Do While hWnd <> 0
    sTitle = Space$(255)
    sTitle = Left$(sTitle, GetWindowText(hWnd, sTitle, Len(sTitle)))
    If sTitle Like Caption Then
      sClass = Space$(255)
      sClass = Left$(sClass, GetClassName(hWnd, sClass, Len(sClass)))
      ClassName = sClass
      Exit Function
    End If
    hWnd = GetWindow(hWnd, GW_HWNDNEXT)
  Loop
End Function
Bạn chỉ cần nhớ mang máng cái title là có thể lấy classname
Ví dụ để lấy classname chương trình của bạn, có thể dùng =ClassName("*TOKYO*")
Nảy giờ thử trên máy tôi thấy rất ngon lành. Hy vọng có thể giúp được cho bạn!
 
Upvote 0
Thưa thầy, em đã thử nhưng không được. không biết bị lỗi sao nữa nhưng kết quả toàn là #NAME?. Thầy xem lại giúp em với ah. ThanksNotepad.JPGNG.JPG
 
Upvote 0
Thưa thầy, em đã thử nhưng không được. không biết bị lỗi sao nữa nhưng kết quả toàn là #NAME?. Thầy xem lại giúp em với ah. ThanksView attachment 132307View attachment 132308

Chắc là bạn dùng Office 64 rồi. Xem lại bài 7 để biết cách khắc phục nhé!
Thêm nữa, sao lại là =ClassName("Notepad") nhỉ? Bạn mở notepad, bạn nhìn thấy tiêu đề nó ghi cái gì? Tôi mở notepad, tôi thấy nó ghi vầy nha "Untitled - Notepad"
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể dùng hàm GetForegroundWindow() để lấy handle của cửa sổ.
Mã:
Declare PtrSafe Function GetForegroundWindow Lib "user32.dll" () As Long
Public h1&, h2&
Sub savehwnd()
h1= GetForegroundWindow()
Application.OnTime Now + TimeValue("00:00:5"), "gethwnd"
End Sub
Sub gethwnd()
h2 = GetForegroundWindow()
End Sub
Sau khi chạy sub savehwnd(), h1 sẽ lưu hwnd của VB, bạn chuyển sang cửa sổ cần lấy handle, 5s sau handle sẽ được lưu vào biến h2. Kết hợp với các hàm API ShowWindow() và BringWindowToTop() trong bài của bạn hungspec để chuyển đổi qua lại.
 
Upvote 0
Thấy mọi người vất vả thì mình xin mạn phép giới thiệu một công cụ có của vb6 nếu có bạn nào cài chương trình VB6 hoặc Visual Studio thì sẽ có công cụ tìm tên className giúp các bạn tên là Microsoft SPY++ đây là giao diện của nó
bat classcuaso.jpg
chỉ việc chọn vào Finder tool và kéo con chỏ chuột vào bất cứ cửa sổ nào muốn biết thông tin nó sẽ hiện ra cho các bạn thông tin về cửa sổ.
 
Upvote 0
Chắc là bạn dùng Office 64 rồi. Xem lại bài 7 để biết cách khắc phục nhé!
Thêm nữa, sao lại là =ClassName("Notepad") nhỉ? Bạn mở notepad, bạn nhìn thấy tiêu đề nó ghi cái gì? Tôi mở notepad, tôi thấy nó ghi vầy nha "Untitled - Notepad"
OfThưa thầy, Em đã thử nhưng vẫn không được ah. Nếu có thể mong thầy up vào file tạm được không ah. E dùng bản win 32 bit mà
 
Upvote 0
Thấy mọi người vất vả thì mình xin mạn phép giới thiệu một công cụ có của vb6 nếu có bạn nào cài chương trình VB6 hoặc Visual Studio thì sẽ có công cụ tìm tên className giúp các bạn tên là Microsoft SPY++ đây là giao diện của nó

chỉ việc chọn vào Finder tool và kéo con chỏ chuột vào bất cứ cửa sổ nào muốn biết thông tin nó sẽ hiện ra cho các bạn thông tin về cửa sổ.
Mình vẫn hay dùng spy++ để lấy thông tin nhưng ở trường hợp này phải thay đổi classname và handle thủ công trong code vba.
 
Upvote 0

File đính kèm

Upvote 0
Thưa thầy, theo hướng dẫn của thầy em đã làm được. Kết quả của nó đây ah:
ClassName: CurlVersionedBufferWindow.5
Tuy nhiên khi switch sang ứng dụng này thì nó ra màn hình trắng xóa và treo ứng dụng. Mặc dù cửa sổ làm việc trước đó vẫn bình thường Untitled.jpg
 
Upvote 0
Thưa thầy, theo hướng dẫn của thầy em đã làm được. Kết quả của nó đây ah:
ClassName: CurlVersionedBufferWindow.5
Tuy nhiên khi switch sang ứng dụng này thì nó ra màn hình trắng xóa và treo ứng dụng. Mặc dù cửa sổ làm việc trước đó vẫn bình thường

Thế thì tôi không biết đâu. Máy là của bạn mà. Tuy nhiên bạn có thể thí nghiệm code trên một máy khác xem thế nào rồi tính
---------------------------------------
Thấy mọi người vất vả thì mình xin mạn phép giới thiệu một công cụ có của vb6 nếu có bạn nào cài chương trình VB6 hoặc Visual Studio thì sẽ có công cụ tìm tên className giúp các bạn tên là Microsoft SPY++ đây là giao diện của nó

chỉ việc chọn vào Finder tool và kéo con chỏ chuột vào bất cứ cửa sổ nào muốn biết thông tin nó sẽ hiện ra cho các bạn thông tin về cửa sổ.
Nghe cũng hấp dẫn. Mình có cài VB6, thế là vào Microsoft Visual Studio 6.0 Tools vọc vọc mấy công cụ trong đó... cái nào cũng chạy, trừ thằng spy++, thế mới điên chứ
(double click vào biểu tượng chương trình, con chuột quay quay khoảng 2s rồi... không có chuyện gì xảy ra nữa cả. Hic...)
 
Upvote 0
Dear các thầy và các bạn, Em thử chuyển sang cửa sổ ứng dụng nhưng nó bị thành màn hình trắng. Và không hoạt động được. Cái này chắc là do ứng dụng người ta lập trình từ trước rồi. Vậy em muốn nhờ mọi người hướng dẫn em Sub khi hoạt động thì con trỏ chuột tự động chạy đến vị trí cho trước với tọa độ trên window. Sau đó click 1 cái.
Em xin cảm ơn nhiều ah :(
 
Upvote 0

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

Back
Top Bottom