1

VB.NET 2008 Express

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Integer, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hwndParent As Integer, ByVal hMenu As Integer, ByVal hInstance As Integer, ByRef lpParam As Object) As Integer

Private Const WS_EX_APPWINDOW = &H40000
Private Const WS_EX_WINDOWEDGE = &H100&
Private Const WS_SYSMENU = &H80000
Private Const WS_CAPTION = &HC00000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)

Dim AppHandle As Int32 = System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32()

Dim WindowHandle as integer = CreateWindowEx(WS_EX_APPWINDOW Or WS_EX_WINDOWEDGE, "MyWindow", "MyTitle", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0, AppHandle, Nothing)

CreateWindowEx は 0 を返しますか?

4

2 に答える 2

2

CreateWindowEx を呼び出した後に NULL をチェックする必要があります。NULL である場合は、すぐに理由を調べるためにMarshal.GetLastWin32Errorを呼び出すことができます。

于 2010-02-16T16:21:28.607 に答える
1

考えられる理由は、"MyWindow" ウィンドウ クラスを RegisterClass/Ex() に登録するのを忘れたか、ウィンドウ プロシージャを正しく設定しなかったか、または WM_CREATE メッセージを適切に処理しなかったことです。また、P/Invoke 宣言が間違っています。64 ビット オペレーティング システムでは動作しません。

この種のコードを自分で記述しないでください。Windows フォームは、CreateWindowEx() の非常に優れたラッパーです。

于 2010-02-16T16:29:24.017 に答える