using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
+using System.Text;
using OpenTween.Connection;
namespace OpenTween
return SelectItem(listView, -1 /* all items */);
}
- [DllImport("user32")]
- private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
-
- /// <summary>
- /// 最小化状態のウィンドウを最小化する前の状態に復元します。
- /// </summary>
- /// <param name="window">復元するウィンドウ。</param>
- /// <exception cref="System.ArgumentNullException"><paramref name="window"/> が null です。</exception>
- public static void RestoreWindow(IWin32Window window)
- {
- if (window == null)
- {
- throw new ArgumentNullException("window");
- }
-
- ShowWindow(window.Handle, /* SW_RESTORE */ 9);
- }
-
#region "画面ブリンク用"
public static bool FlashMyWindow(IntPtr hwnd,
FlashSpecification flashType,
}
/// http://www.atmarkit.co.jp/fdotnet/dotnettips/723flashwindow/flashwindow.html
[DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FlashWindowEx(
ref FLASHWINFO FWInfo);
#endregion
[DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ValidateRect(
IntPtr hwnd,
IntPtr rect);
#region "スクリーンセーバー起動中か判定"
[DllImport("user32", CharSet = CharSet.Auto)]
- private static extern int SystemParametersInfo(
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static extern bool SystemParametersInfo(
int intAction,
int intParam,
- ref bool bParam,
+ [MarshalAs(UnmanagedType.Bool)] ref bool bParam,
int intWinIniFlag);
// returns non-zero value if function succeeds
{
// use the GlobalAddAtom API to get a unique ID (as suggested by MSDN docs)
registerCount++;
- var atomName = Thread.CurrentThread.ManagedThreadId.ToString("X8") + targetForm.Name + registerCount.ToString();
+ var atomName = Thread.CurrentThread.ManagedThreadId.ToString("X8") + targetForm.Name + registerCount;
hotkeyID = GlobalAddAtom(atomName);
if (hotkeyID == 0)
{
#region "プロセスのProxy設定"
[DllImport("wininet.dll", SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
private static extern bool InternetSetOption(IntPtr hInternet,
InternetOption dwOption,
[In] ref InternetProxyInfo lpBuffer,
int lpdwBufferLength);
- [DllImport("wininet.dll", SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
- private static extern bool InternetSetOption(IntPtr hInternet,
- InternetOption dwOption,
- string lpBuffer,
- int lpdwBufferLength);
-
private enum InternetOption
{
PROXY = 38,
throw new Win32Exception();
}
- private static void RefreshProxyAccount(string username, string password)
- {
- if (!string.IsNullOrEmpty(username) || !string.IsNullOrEmpty(password))
- {
- if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_USERNAME, (string)null, 0))
- throw new Win32Exception();
-
- if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_PASSWORD, (string)null, 0))
- throw new Win32Exception();
- }
- else
- {
- if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_USERNAME, username, username.Length + 1))
- throw new Win32Exception();
-
- if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_PASSWORD, password, password.Length + 1))
- throw new Win32Exception();
- }
- }
-
public static void SetProxy(ProxyType pType, string host, int port, string username, string password)
{
string proxy = null;
proxy = "";
break;
case ProxyType.Specified:
- proxy = host + (port > 0 ? ":" + port.ToString() : "");
+ proxy = host + (port > 0 ? ":" + port : "");
break;
}
RefreshProxySettings(proxy);
- // グローバルプロキシ (NULL = IntPtr.Zero) にユーザー名・パスワードをセットできないため無効化
- //RefreshProxyAccount(username, password);
}
#endregion
return si.nPos;
}
+
+ #region "ウィンドウの検索"
+
+ [DllImport("user32.dll")]
+ private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint procId);
+
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private delegate bool EnumWindowCallback(IntPtr hWnd, int lParam);
+
+ [DllImport("user32")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static extern bool EnumWindows(EnumWindowCallback lpEnumFunc, IntPtr lParam);
+
+ [DllImport("user32.dll", CharSet = CharSet.Unicode)]
+ private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
+
+ [DllImport("user32.dll", CharSet = CharSet.Unicode)]
+ private static extern int GetWindowTextLength(IntPtr hWnd);
+
+ /// <summary>
+ /// 指定したPIDとタイトルを持つウィンドウのウィンドウハンドルを取得します
+ /// </summary>
+ /// <param name="pid">対象ウィンドウのPID</param>
+ /// <param name="searchWindowTitle">対象ウィンドウのタイトル</param>
+ /// <returns>ウィンドウハンドル。検索に失敗した場合は<see cref="IntPtr.Zero"/></returns>
+ public static IntPtr GetWindowHandle(uint pid, string searchWindowTitle)
+ {
+ var foundHwnd = IntPtr.Zero;
+
+ EnumWindows((hWnd, lParam) =>
+ {
+ GetWindowThreadProcessId(hWnd, out var procId);
+
+ if (procId == pid)
+ {
+ int windowTitleLen = GetWindowTextLength(hWnd);
+
+ if (windowTitleLen > 0)
+ {
+ StringBuilder windowTitle = new StringBuilder(windowTitleLen + 1);
+ GetWindowText(hWnd, windowTitle, windowTitle.Capacity);
+
+ if (windowTitle.ToString().Contains(searchWindowTitle))
+ {
+ foundHwnd = hWnd;
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }, IntPtr.Zero);
+
+ return foundHwnd;
+ }
+
+ #endregion
+
+ #region "ウィンドウのアクティブ化"
+
+ private enum ShowWindowCommands : int
+ {
+ /// <summary>最小化・最大化されたウィンドウを元に戻して表示</summary>
+ SW_RESTORE = 9,
+ }
+
+ [DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);
+
+ [DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static extern bool SetForegroundWindow(IntPtr hWnd);
+
+ /// <summary>
+ /// 指定したウィンドウをアクティブにします
+ /// </summary>
+ /// <param name="hWnd">アクティブにするウィンドウのウィンドウハンドル</param>
+ public static void SetActiveWindow(IntPtr hWnd)
+ {
+ ShowWindow(hWnd, ShowWindowCommands.SW_RESTORE);
+ SetForegroundWindow(hWnd);
+ }
+
+ #endregion
}
}