SQLの窓

2009年10月31日


【絶滅危惧】WINAPI+C : マウスの移動単位って【ミッキー】というんですね

【xp で動作確認しました(vs2008) つまりデータから勝手に絵を描かせられるのです】


マウスの動作のエミュレーションしようと思って、以前使ったSendInput 関数 の
詳細の裏を取りに行ったら、この処理の詳細はこの前の古い関数のところに
説明があるのです。

mouse_event 関数

で、この関数の座標の説明に「ミッキー」が出現します

ちょっと笑ってしまいましたが、処理するのにミッキーの設定をピクセルにしたいので
調べてみるとありました( 検証はまだです )
SDK32:第 2 モニタでの mouse_event と絶対座標移動

相当古い資料なので本当に今動くのかどうか解りませんが、これからチェックします
int  oldAccel[3], newAccel[3], oldSpeed, newSpeed, x, y;
BOOL bResult;

// 以下の値でマウスの移動量を 1 ミッキー/ピクセルに設定する
newAccel[0] = 0;
newAccel[1] = 0;
newAccel[2] = 0;
newSpeed = 1;

// 現在のマウス加速度定数を保存する
bResult = SystemParametersInfo(SPI_GETMOUSE, 0, oldAccel, 0);
bResult = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &oldSpeed, 0);

// マウス加速度定数(無効)を設定する
bResult = SystemParametersInfo(SPI_SETMOUSE, 0, newAccel,
					 SPIF_SENDCHANGE);
bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, &newSpeed,
					 SPIF_SENDCHANGE);

//任意の x, y 座標を設定する
x = -100;
y = -150;

mouse_event(MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0);

// 標準モニタの左上(原点)にカーソルを移動する
mouse_event(0, x, y, 0, 0);
// カーソルを要求された座標に移動する

// 保存したマウス加速度定数を戻す
bResult = SystemParametersInfo(SPI_SETMOUSE,0, oldAccel,
					 SPIF_SENDCHANGE);
bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, &oldSpeed,
					 SPIF_SENDCHANGE);

当然、mouse_event は、SendInput に変更する必要ありますが、
いかにも絶滅危惧らしい情報のなりたちです
あ、そうそう。構造体を見たい場合も一苦労です。
INPUT Structure ()


posted by lightbox at 2009-10-31 19:05 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅危惧】C言語 : PostMessageのフック

内部では自前のクラスを使っていますが、フックそのものとはあまり関係無いので。

フックするには、登録する必要がありますし、DLL である必要があります
全体のソースコードはこちらになります
SendMessage と PostMessage のフック

実際にログを取るアプリケーションを作ってちゃんと動いてました。
主に、Windowsアプリケーションのメニューに対するメッセージをハックするのに使っていました。
( SQLの窓に同梱しています )
// *********************************************************
// PostMessge のフック処理
// *********************************************************
LRESULT CALLBACK GetMsgProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhkPost, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		MSG *msg;
		char szClass[512];
		char szTitle[512];

		msg = (MSG *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"POST:WM_COMMAND:"
					"%lu:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
		CloseHandle(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}



タグ:C言語 Hook DLL
posted by lightbox at 2009-10-31 15:19 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅コード】インラインアセンブラ : PC98 のグラフ LIO

LIO は絶滅しています。当時、真っ黒な画面にこいつらでカラーのポップアップウインドウを表示したりしてました。ソースコードのタイムスタンプでさえ 1993 年 です。

直線を引く
/***********************************************************/
/***    LIO版 直線、短形の描画                       ***/
/***********************************************************/
/***        項目名                   引き数名            ***/
/***    描画始点の座標               x1,y1               ***/
/***    描画終点の座標               x2,y2               ***/
/***    パレット番号                 paret               ***/
/***    描画コード(B,BF)       byoga               ***/
/***    ラインスタイルスイッチ       lswitch             ***/
/***    ラインスタイルすいっちLo   lstairu             ***/
/***    ラインスタイルすいっちHi   hstairu             ***/
/***********************************************************/
#include <memory.h>

static unsigned char *param;
static unsigned int  paramoff;
static unsigned int  ucwseg;
extern unsigned int  lioucw;

extern
void
gline( int x1, int y1, int x2, int y2, int paret, int byoga, int lswitch, int lstairu, int hstairu)
{

   unsigned long work;
   unsigned char sts;

   ucwseg = lioucw;
   work = (unsigned long)lioucw * 256L * 256L;
   work = work + 5120;
   param = (char *)work;
   
   memcpy( param  , (char *)&x1 , 2 );
   memcpy( param+2, (char *)&y1 , 2 );
   memcpy( param+4, (char *)&x2 , 2 );
   memcpy( param+6, (char *)&y2 , 2 );
   (*(param+8)) = (unsigned char)paret;
   (*(param+9)) = (unsigned char)byoga;
   (*(param+10)) = (unsigned char)lswitch;
   (*(param+11)) = (unsigned char)lstairu;
   (*(param+12)) = (unsigned char)hstairu;

	_asm {
		push	ds
		push	es
		push	ss
		push	bx
		push	cx
		push	dx
		push	bp
		push	sp
		push	si
		push	di

		mov	ax,WORD PTR ucwseg
		mov	ds,ax
		mov	bx,5120
		int	0a7h

		pop	di
		pop	si
		pop	sp
		pop	bp
		pop	dx
		pop	cx
		pop	bx
		pop	ss
		pop	es
		pop	ds
		mov	BYTE PTR sts,ah
	}

}



posted by lightbox at 2009-10-31 15:06 | 記録 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり