Windows 7のようにWindowsを操作するためのプログラム-ホットキーを使用:Win + [Up | Down | Left | Right]

自分で書いたものを使うことはめったにありません。 しかし、これは非常にまれなケースです。

Windows 7では、キーボードショートカットを使用してウィンドウを配置する機能がとても気に入りました。

Win + Left-ウィンドウは左端に取り付けられます

Win + Right-ウィンドウは右端に接続されます

Win + Up-ウィンドウが最大化されます

Win + Bottom-通常の状態のウィンドウ。

さらに、私の意見では、ウィンドウを右端と左端に固定することは非常に便利です。なぜなら、比較または再印刷の可能性があるので、画面上に2つのウィンドウを自分で配置しなければならなかった回数...



Windows 7をメインOSとして使用したくない-ベータ版(またはCR、主なものはリリースではない)であるが、上記の機会を使用したい。 だから-私は怠け者ではなく、Vistaでこの機能を実装するC#でプログラムを書いた(おそらくそれは以前のバージョンで動作する-私はそれをチェックしなかった)。 そして判明したように、タスクはそれほど難しくありません。 多くのWinApi関数をインポートする必要があり、実装自体は2つに分割されました。a)必要なキーボードショートカットのキーストロークをインターセプトする機能b)ウィンドウの配置。



C#の低レベルキーボードフックという記事を使用して最初のタスクを解決しました。LWinキーが押されたときを見つける機会を見つけるだけでした。

private static IntPtr HookCallback(

int nCode, IntPtr wParam, IntPtr lParam)

{

if (nCode >= 0 && wParam == ( IntPtr )WAKeysHook.WmKeyDown)

{

if (( int )WAKeysHook.GetAsyncKeyState(( IntPtr )Keys.LWin) != 0) // Left Win Key

{

Keys key = (Keys) Marshal.ReadInt32(lParam);

if (key == Keys.Left || key == Keys.Right || key == Keys.Up || key == Keys.Down) // Arrows keys

SetWindowLocation(key);

}

}

return WAKeysHook.CallNextHookEx(WaKeysHook.HookId, nCode, wParam, lParam);

}




* This source code was highlighted with Source Code Highlighter .




タスクの2番目の部分:アクティブなウィンドウを見つけて適切なサイズに設定する(言うまでもなく、この機能(WS_SIZEBOX)を使用してウィンドウのサイズを変更できるだけでなく、cmd.exeなどの最大ウィンドウサイズが許可されているウィンドウもあります) :

private static void SetWindowLocation(Keys k)

{

//Active Window

IntPtr window = WAWindows.GetForegroundWindow();

// Check SIZEBOX Style (Window can sizable)

if ((( int )WAWindows.GetWindowLongPtr(window, WAWindows.GwlStyle) & WAWindows.WsSizebox)

== WAWindows.WsSizebox)

{

// Show window in normal state (if always maximized)

WAWindows.ShowWindow(window, ( int )WAWindows.WindowShowStyle.ShowNormal);



//Need Maximazed

if (k != Keys.Down)

{

WAWindows.ShowWindow(window, ( int )WAWindows.WindowShowStyle.ShowMaximized);



// Place Window on left or right

if (k != Keys.Up)

{

WAWindows.Rect rect, rectDesktop;

if (WAWindows.GetWindowRect(window, out rect) && WAWindows.GetWindowRect(WAWindows.GetDesktopWindow(), out rectDesktop))

{

WAWindows.SetWindowPos(window, WAWindows.HwndTop, (k == Keys.Left) ? Math .Min(rect.Left, 0) : rectDesktop.Right / 2, rect.Top, Math .Min(rect.Width, rectDesktop.Right / 2 - Math .Min(rect.Left, 0)),

Math .Min(rect.Height, rectDesktop.Bottom), WAWindows.SwpShowwindow);

}

}

}

}

}




* This source code was highlighted with Source Code Highlighter .




そして最後に、私のプログラムで、インストールオプションを導入しました-トレイにアイコンを表示する必要があるかどうかは、プログラムを閉じるのに役立ちます。このため、app.configの対応するセクションで値を設定する必要があります。

< applicationSettings >

< VistaKeysExtender.Properties.Settings >

< setting name ="ShowNotifyIcon" serializeAs ="String" >

< value > False </ value >

</ setting >

</ VistaKeysExtender.Properties.Settings >

</ applicationSettings >




* This source code was highlighted with Source Code Highlighter .




アイコン自体は必要ありません。プログラムは常にバックグラウンドで回転し、トレイの場所はいっぱいです。 記事の上部でファンクションキーについて説明しました。 私は質問や提案に耳を傾け、それらに答える準備ができています。 誰かがこのプログラムを私と同じくらい役に立つと思うことを願っています。

UPD:プログラムはこのアドレスで継続されましたhttp://outcoldman.habrahabr.ru/blog/57792/




All Articles