2016-01-16 3 views
-2

В приложении VB6 я проверяю, если существует определенное окно VB.NET WinForms:IsWindow возвращает ложь для существующего дескриптора окна

Public Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long 

If Not IsWindow(102937) Then 
     MessageBox("Window not found!") 
End If 

MessageBox показан, но окно не существует.

я осмотреть его

Debug.Print(Me.Handle.ToInt32)'it prints 102937 

То, что происходит здесь не так? Возможно, я неправильно обрабатываю возвращаемое значение «IsWindow»?

спасибо.

+1

возвращаемого значения [IsWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633528.aspx) имеет типа ' BOOL', typedef для 'int' (32-разрядное целое число со знаком). [Long] (https://msdn.microsoft.com/en-us/library/y595sc15.aspx) в VB.NET - 64 бит. Вместо этого используйте [Целое] (https://msdn.microsoft.com/en-us/library/06bkb8w2.aspx). – IInspectable

+0

'Нить не должна использовать IsWindow для окна, которое оно не создало, потому что окно могло быть уничтожено после вызова этой функции. Кроме того, поскольку ручки окна возвращаются, ручка может даже указывать на другое окно. ' – Plutonix

+0

Ваш дескриптор окна нечетный? В самом деле? –

ответ

-1

Я нашел решение:

Я действительно с помощью функции WinAPI неправильно.

я должен использовать

If IsWindow(102937) <> 1 Then 
+3

Нет, это неправильно. IsWindow возвращает либо нуль, либо произвольное ненулевое значение, поэтому вы должны сравнить значение с 0, а не 1. Комментарий Inspectable является правильным и наиболее вероятной причиной проблемы. (Если есть сомнения, распечатайте вывод IsWindow и посмотрите, что это такое. Я думаю, вы найдете, что нижние 32 бита равны нулю, и вы получаете мусор в верхних 32 битах.) –

+0

Хорошо, но обратите внимание, что это VB6, где Long - 32 бита, а не 64. – Bob77