ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 18:21

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2012年5月08日(火) 21:35 
オフライン

登録日時: 2007年1月27日(土) 14:03
記事: 32
IE上で 左クリックした時のマウス座標を 取得したくて 色々調べましたが
イマイチ解りません。 ご教授願います

1.ABで作成したソフトを起動後 IEを起動します(手動でOK)
2.ABソフトで 座標取得状態にします
3.IE上のある点を 左(右)クリックします
4.AB作成ソフトで マウス座標を 得る

詳しい人のHPにて 下記のコードを 見つけて一部
変更しています
動作は しますが ABの画面上しか 取得不可です
よろしく お願いします
-------------------------
#N88BASIC
Dim pos As POINTAPI
Dim lpPrevWndProc As VoidPtr

Function MouseProc(hWnd As HWND,dwMsg As DWord,wParam As WPARAM,lParam As LPARAM) As LRESULT
Select Case dwMsg
Case WM_MOUSEMOVE
Case WM_LBUTTONDOWN
GetCursorPos(pos)
MsgBox 0,Str$(pos.x),"マウス座標"
Case WM_RBUTTONDOWN
Case WM_LBUTTONUP
Case WM_RBUTTONUP
Case Else
MouseProc=CallWindowProc(lpPrevWndProc,hWnd,dwMsg,wParam,lParam)
End Select
End Function

lpPrevWndProc=SetWindowLong(_PromptSys_hWnd,GWL_WNDPROC,AddressOf(MouseProc))
'メインのコードここから
Sleep(5000)
'メインのコードここまで
SetWindowLong(_PromptSys_hWnd,GWL_WNDPROC,lpPrevWndProc)

-----------------------


通報する
ページトップ
投稿記事Posted: 2012年5月09日(水) 01:29 
IEのイベント(?)をこっちのソフトで取得すればいいんですよね・・・

試しにGetWindowProcでウィンドウプロシージャのアドレスを取得してサブクラス化しようとしましたが、必ずエラーが返ってきます。
コード:
#N88BASIC

Dim IEWnd As HWND,IEDefProc As DWord
Function GetError() As String'エラーを取得する関数(勝手に作りました)
	Dim lpMsgBuf As BytePtr
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),LANG_USER_DEFAULT,VarPtr(lpMsgBuf),0,NULL)
	GetError=MakeStr(lpMsgBuf)
	LocalFree(lpMsgBuf)
EndFunction

IEWnd=FindWindow("IEFrame",NULL)'IEのウィンドウハンドルを取得

IEDefProc=GetWindowLong(IEWnd,GWL_WNDPROC)'アドレスを取得のはず…

SetWindowLong(IEWnd,GWL_WNDPROC,AddressOf(SubClass))'サブクラス化

print IEWnd,IEDefProc,GetError()

'↓サブクラス 右クリでメッセージボックス
Function SubClass(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	If dwMsg = WM_RBUTTONUP Then
		MessageBox(_PromptSys_hWnd, "右クリック", "test", MB_OK)
	End If
	SubClass=CallWindowProc(IEDefProc, hWnd,dwMsg,wParam,lParam)
EndFunction
調べてみたところ、こんな問題が
URL

SetWindowsHookEx()を使うと上手く行くんだか行かないんだか。

僕にはよく分かりません。

詳しい人よろしくお願いします。


通報する
ページトップ
   
投稿記事Posted: 2012年5月09日(水) 07:20 
オフライン

登録日時: 2007年1月27日(土) 14:03
記事: 32
早速ありがとうございます
UWSCなどのソフトを使えば簡単だろうと言われるかもしれませんが
必要なのは マウスクリックした時のカーソルの位置(x、y)だけなので。
複雑な事ができるUWSCなどを使わなくても できないかな?と思った
からです。

なお 環境を書くのを忘れてました

AB:4.24  OS:XP IE:6

OSなどは すぐにVerUPする予定は ありません
よろしく お願いします


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2012年5月10日(木) 00:47 
あまりスマートな例ではないけど
ウインドウが非アクティブになったときの座標を取得する。
そのため
1.IE起動
2ABで作ったウインドウを起動
3、IE上でクリック
するとABで作ったウインドウタイトルに座標が表示される仕組み。



Sub MainWnd_Activate(state As Integer, minimized As Integer)
If state = WA_INACTIVE Then
Dim pos As POINTAPI
Dim s[30] As Byte
GetCursorPos(pos)
wsprintf(s, "x=%d y=%d", pos.x, pos.y)
SetWindowText(hMainWnd, s)
End If
End Sub


通報する
ページトップ
   
投稿記事Posted: 2012年5月11日(金) 07:14 
オフライン

登録日時: 2007年1月27日(土) 14:03
記事: 32
出かけていたので 返信が遅れました。スミマセン。

なるほど。そうですね!
APIやシステムに詳しくないので ストレートだけでした。
ウィンドゥIDを取得して クリックされたイベントを取得する
ことだけを 考えてました

変化球での回答を いただいて 色々な考え方をしないと
無知は私には 壁が高いと感じました。

初期目的のX、Y座標は 充分得ることができました。
ありがとう ございます

(最初にクリックした位置だけの 取得も満足です)


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[27人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean