• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Vấn đề với FindWindow trên VB.Net

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Moderators: tungblt, vuathongtin

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Posts: 62
Joined: Tue 17/01/2006 9:43 am
Location: Where Bill Gates beats the penguin just like the Batman
Contact:

Vấn đề với FindWindow trên VB.Net

Postby luungoc2005 » Tue 17/06/2008 9:37 pm

Em mới chuyển qua học VB.Net, khi thử đoạn code này thấy có vấn đề:

Code: Select all

  1.  
  2.     Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowW" (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32
  3.     Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExW" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As Int32
  4.     Public hwndDesk As Integer
  5.     Public hwndDeskIcons As Integer
  6.     Public hwndTaskbar As Integer
  7.     Public hwndBar As Integer
  8.     Public hwndTray As Integer
  9.     Public Sub GetHandles()
  10.         ' get desktop handle
  11.         hwndDesk = GetDesktopWindow
  12.  
  13.         ' get desktop icons handle
  14.         hwndDeskIcons = FindWindow("Progman", "Program Manager")
  15.         hwndDeskIcons = FindWindowEx(hwndDeskIcons, vbNull, "SHELLDLL_DefView", "")
  16.         hwndDeskIcons = FindWindowEx(hwndDeskIcons, vbNull, "SysListView32", "FolderView")
  17.  
  18.         ' get toolbar and systray handles
  19.         hwndTray = FindWindow("Shell_TrayWnd", vbNullString)
  20.         hwndBar = FindWindowEx(hwndTray, vbNull, "ReBarWindow32", "")
  21.  
  22.         If hwndBar = 0 Then hwndBar = hwndTray
  23.  
  24.         ' get taskbar handle
  25.         hwndTaskbar = FindWindowEx(hwndBar, vbNull, "MSTaskSwWClass", "")
  26.     End Sub
  27.  


Toàn bộ đống FindWindow+FindWindowEx đều trả về 0, dùng GetLastError trả về 2(error 2 là gì nhỉ, em goog thấy là file not found????). Đoạn code này code theo dạng VB6 (trừ phần khai báo API, copy trong API Viewer 2004 :D ). Vậy phải fix ra sao?


A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.

anton
Thành viên năng nổ
Thành viên năng nổ
Posts: 66
Joined: Sun 16/07/2006 7:55 am
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby anton » Tue 17/06/2008 10:08 pm

Riêng với mấy cái API đụng tới handle của cửa sổ thì cần thay kiểu dữ liệu số (Long, Integer) thành IntPtr
Đây là kinh nghiệm xương máu của anton hồi làm Click n see cho thằng v2V :D

VD: ByVal hwnd As IntPtr
Em iu bác Phạm, bác Chuối (The Last Leaf), bạn To, bạn Trí :D
---
My blog: http://360.yahoo.com/tk.duong
My website: http://truckhuyen.googlepages.com

bong_dem
Posts: 4
Joined: Tue 17/06/2008 9:11 pm
Location: Đà Nẵng

Re: Vấn đề với FindWindow trên VB.Net

Postby bong_dem » Tue 17/06/2008 10:09 pm

Trả hiểu ? xài C# thấy đâu có vấn đề gì ?
nếu đoạn code này có vấn đề thì chắc tớ phải edit lại soft rùi :-S
Bóng đêm đã trở lại và nợi hại gấp trăm lần >:)

User avatar
anhtuyenbk
Guru
Guru
Posts: 1311
Joined: Thu 22/09/2005 4:12 pm
Location: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 times

Re: Vấn đề với FindWindow trên VB.Net

Postby anhtuyenbk » Tue 17/06/2008 10:11 pm

bong_dem wrote:Trả hiểu ? xài C# thấy đâu có vấn đề gì ?
nếu đoạn code này có vấn đề thì chắc tớ phải edit lại soft rùi :-S

ặc, khai báo API trong C# rắc rối hơn VB.Net nhiều :P
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Posts: 62
Joined: Tue 17/01/2006 9:43 am
Location: Where Bill Gates beats the penguin just like the Batman
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby luungoc2005 » Tue 17/06/2008 10:27 pm

Cái IntPtr này sử dụng ra sao hả trời @-)

    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowW" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExW" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
 
    Public hwndDesk As IntPtr
    Public hwndDeskIcons As IntPtr
    Public hwndTaskbar As IntPtr
    Public hwndBar As IntPtr
    Public hwndTray As IntPtr
 
    Public Sub GetTaskbarHwnd()
        ' get desktop handle
        hwndDesk = GetDesktopWindow
 
        ' get desktop icons handle
        hwndDeskIcons = FindWindow("Progman", "Program Manager")
        hwndDeskIcons = FindWindowEx(hwndDeskIcons, vbNull, "SHELLDLL_DefView", "")
        hwndDeskIcons = FindWindowEx(hwndDeskIcons, vbNull, "SysListView32", "FolderView")
 
        ' get bar and systray handles
        hwndTray = FindWindow("Shell_TrayWnd", vbNullString)
        hwndBar = FindWindowEx(hwndTray, vbNull, "ReBarWindow32", "")
 
        If hwndBar = 0 Then hwndBar = hwndTray
 
        ' get taskbar handle
        hwndTaskbar = FindWindowEx(hwndBar, vbNull, "MSTaskSwWClass", "")
    End Sub

Vẫn vậy....
A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Posts: 62
Joined: Tue 17/01/2006 9:43 am
Location: Where Bill Gates beats the penguin just like the Batman
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby luungoc2005 » Wed 18/06/2008 4:19 pm

Tình hình là sau khi chuyển đoạn code thành như sau:

Code: Select all

  1. Private Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
  2.     Private Declare Auto Function FindWindowEx Lib "user32.dll" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
  3.     Private Declare Auto Function GetDesktopWindow Lib "user32.dll" () As IntPtr
  4.     Public hwndDesk As IntPtr
  5.     Public hwndDeskIcons As IntPtr
  6.     Public hwndTaskbar As IntPtr
  7.     Public hwndBar As IntPtr
  8.     Public hwndTray As IntPtr
  9.     Public Sub GetHandles()
  10.         ' get desktop handle
  11.         hwndDesk = GetDesktopWindow()
  12.         ' get desktop icons handle
  13.         hwndDeskIcons = FindWindow("Progman", "Program Manager")
  14.         hwndDeskIcons = FindWindowEx(hwndDeskIcons, vbNull, "SHELLDLL_DefView", "")
  15.         hwndDeskIcons = FindWindowEx(hwndDeskIcons, vbNull, "SysListView32", "FolderView")
  16.  
  17.         ' get toolbar and systray handles
  18.         hwndTray = FindWindow("Shell_TrayWnd", vbNullString)
  19.         hwndBar = FindWindowEx(hwndTray, vbNull, "ReBarWindow32", "")
  20.  
  21.         If hwndBar = 0 Then hwndBar = hwndTray
  22.  
  23.         ' get taskbar handle
  24.         hwndTaskbar = FindWindowEx(hwndBar, vbNull, "MSTaskSwWClass", "")
  25.  
  26.     End Sub


2 hàm FindWindow đều trả về handle là 65610 (ko tồn tại, và nếu có chẳng nhẽ tồn tại 2 window cùng handle khác classname @-) ) => 2 cái findwindowex vẫn error 1400 (invalid window...)
Còn mấy cái classname em có thể chắc chắn tới 99,9999999...% (ko tuyệt đối :D )
A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.

User avatar
farmersoft
Thành viên chính thức
Thành viên chính thức
Posts: 15
Joined: Fri 13/06/2008 7:31 pm
Location: Hải Phòng
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby farmersoft » Wed 18/06/2008 5:41 pm

Thử

Code: Select all

  1. Imports System.Runtime.InteropServices
Miễn lễ

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Posts: 62
Joined: Tue 17/01/2006 9:43 am
Location: Where Bill Gates beats the penguin just like the Batman
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby luungoc2005 » Thu 19/06/2008 1:13 pm

có ai thật sự biết cách giải quyết ko đây... :((
A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby Kỳ Nam » Thu 19/06/2008 1:52 pm

khai báo đây

Code: Select all

  1.        Public Declare Auto Function FindWindowEx Lib "user32" (ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpszWindow As String) As IntPtr
  2.  
  3.         Public Declare Auto Function FindWindow Lib "user32" (<MarshalAs(UnmanagedType.LPTStr)> ByVal lpClassName As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpWindowName As String) As IntPtr
  4.  


IntPtr nào 0 dùng thì để IntPtr.Zero

luungoc2005
Thành viên năng nổ
Thành viên năng nổ
Posts: 62
Joined: Tue 17/01/2006 9:43 am
Location: Where Bill Gates beats the penguin just like the Batman
Contact:

Re: Vấn đề với FindWindow trên VB.Net

Postby luungoc2005 » Thu 26/06/2008 5:25 pm

lần này 1 cái ra 1247882 (handle system tray), còn lại cả đống ra 0 (sao hoài ko được vậy :(( )
Edit: Cuối cùng cũng giải quyết xong, thay vbNull = IntPtr.Zero :D (có thể mà làm hoài mới ra :D )
A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.


Return to “Visual Basic .NET và C# (VB.NET & C#)”

Who is online

Users browsing this forum: No registered users and 25 guests