• ベストアンサー

VB.netでFindWindowExやると・・・9222812402616107008!?

VB.netでWin32APIのFindWindowExを使うと, たとえばスタートボタンのHWNDを拾ってくるとき, 本当なら65662(6.0のSpy++で確認+10進変換)が返ってきて欲しいんですが, 9222812402616107008という,異常な数が返ってきます. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpsz1 As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpsz2 As String) As Long とやってあります. VB6.0のAPIビューワからコピペして,MarshalAsをつけてみました.   (初心者なので,わけわからないまま付けましたけど; hWnd_ShellTrayWnd = FindWindowEx(0,0,"Shell_TrayWnd",vbNullString) hWnd_StartButton = FindWindowEx(hwnd_ShellTrayWnd,0,"Button",vbNullString) とやってるのですが・・・. 不思議なのは,hWnd_ShellTrayWndが9222812402616238204になっているにもかかわらず,次のFindWindowExで,hWnd_StartBtnが9222812402616107008になってるところです・・・. しかも,ありえないクラス名(KeyBoadぐちゃぐちゃ押し)を指定しても,なぜか数が返ってくるんです. FindWindowExを成功させる(きちんとした数を取る)方法,またはFindWindowEx以外でhWndを拾ってくる方法,ありましたら,教えてください.

質問者が選んだベストアンサー

  • ベストアンサー
  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.4

あちゃぁ、英語のサイトから持ってきたのでコメント診て無かったです。すみません。 翻訳しても良くわからなかったですが、どう見ても記述が違いますね。 で、再度アドバイスです。 >Private Declare Function FindWindowEx ~ Integerを全てLongに書き換えてやってますよね。 引数・戻り値を全てIntegerにしてやって見てください。 当方では、問題なくウィンドウハンドルの取得が出来ましたよ。 ちなみに、MarshalAs属性は使用しなくてOKでした。 使用すると、戻り値が0になりました。 当方で確認したソースを記述します。 以下よりソース。 Option Strict Off Option Explicit On Imports System.Runtime.InteropServices Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _   (ByVal hWnd1 As Integer,   ByVal hWnd2 As Integer,   ByVal lpsz1 As String,   ByVal lpsz2 As String) As Integer   Private Sub Form1_Load(ByVal eventSender As System.Object, _              ByVal eventArgs As System.EventArgs) Handles MyBase.Load     Dim hWnd_StartButton As Integer     Dim hwnd_ShellTrayWnd As Integer     hwnd_ShellTrayWnd = FindWindowEx(0, 0, "Shell_TrayWnd", vbNullString)     hWnd_StartButton = FindWindowEx(hwnd_ShellTrayWnd, 0, "Button", vbNullString)     System.Diagnostics.Debug.WriteLine(hwnd_ShellTrayWnd & ";" & hWnd_StartButton) End Sub

M2452
質問者

お礼

できました!  ありがとうございます! ただ単にLongをIntegerにするだけなんて・・・  気づきませんでした.

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

ありゃ、よく見たらNETでしたか。。。 大変失礼しました。m(_ _)m NETは無知のため、、、発言をひかえます。&#1の発言撤回

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.2

もしかしたら、宣言に問題があるかもです。 (私の勝手な読みなので、違ってたら無視してください。) FindWindowExのサンプルが見つからなかったので、見つかったFindWindowの 宣言サンプルを以下に書きます。 .NETでは、以下のように宣言するようです。参考になれば幸いです。 [DllImport("user32.dll")] public extern static int FindWindow(string strClassName, string strWindowName);

M2452
質問者

補足

このソースだと・・・波線引かれました. あと,FindWindowの戻り値は,(VBでは)Longだったと思うんですが. J#.netなら,  /** @dll.import("user32") */ private static native int FindWindow(string strClassName, string strWindowName); で宣言できましたが;  (VJ++6.0と全く同じコード 最後にintが来てないところを見ると,このソースはVBではないような気がしますが・・・; C#じゃないですかね・・・(わかりませんが;もってないので VBだと,As Integerという風なります.(「int」というのはないですね.) あと,質問時書き忘れたんですが・・・  私のはVisualBasic.net Standardです. スタンダード版だからできないのでしょうか・・・

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

サンプルならいたるところに落ちてます。 Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Public Declare Function GetDesktopWindow Lib "user32" () As Long Sub Main()   Dim lngDeskTopWnd  As Long   Dim lngTrayWnd   As Long   Dim lngStartBtnWnd As Long      lngDeskTopWnd = GetDesktopWindow   lngTrayWnd = FindWindowEx(lngDeskTopWnd, 0&, "Shell_TrayWnd", vbNullString)   lngStartBtnWnd = FindWindowEx(lngTrayWnd, 0&, "Button", vbNullString) End Sub

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=199357
M2452
質問者

補足

はい.ソースを見る限り,「VisualBasic6.0」なら動きそうですが・・・.   (というか,動きますね.6.0なら. 私のVB.netでは,9222812402616107008が返ってきました. どうやら,このソースではできないみたいです.   (私が使いたいのはVB.netなので・・・. あと,このソースについてなのですが, lngDeskTopWnd = GetDesktopWindow lngTrayWnd = FindWindowEx(lngDeskTopWnd, 0&, "Shell_TrayWnd", vbNullString) ではなく, lngTrayWnd = FindWindowEx(0&, 0&, "Shell_TrayWnd", vbNullString) としてもできそうなのですが・・・.  今はVB6.0はアンインストールしてしまったので,わかりません;

関連するQ&A

専門家に質問してみよう