我正在编写桌面应用程序,在一部分中我将介绍OAuth 2.0流程。
步骤如下:
问题在于,如果用户之前在网络浏览器中打开了一些标签 - 在第1点中添加了新选项卡,在第4点中。一切都已关闭(带有所有标签的网络浏览器)。
您能否告诉我是否有办法在网络浏览器中关闭单个标签? 或者也许还有其他/更简单的方法来通过OAuth?
作为手动解决方案,我只会向用户显示信息“现在您可以关闭此标签”,但我想自动完成。
这是C#.Net 4.0 WPF项目。
string strAuthUrl = "http://accounts.example.com/login",
strAuthCode = string.Empty;
// Request authorization from the user (by opening a browser window):
ProcessStartInfo startInfo = new ProcessStartInfo(strAuthUrl);
startInfo.CreateNoWindow = false;
//1.
Process.Start(startInfo);
//2. - is happening in web browser
//3.
do
{
foreach (Process proc in Process.GetProcesses())
{
if (proc.MainWindowTitle.StartsWith("Success code="))
{
strAuthCode = proc.MainWindowTitle.ToString().Substring(13, 30);
//4.
try
{
// Close process by sending a close message to its main window.
proc.CloseMainWindow();
// Free resources associated with process.
proc.Close();
// Wait 500 milisecs for exit
proc.WaitForExit(500);
//if proc has not exited so far - kill it
if (proc.HasExited == false)
{
proc.Kill();
proc.WaitForExit();
}
}
catch (Exception ex)
{
//Do something with exception
}
break;
}
}
}
while (string.IsNullOrEmpty(strAuthCode));
感谢您的建议。
答案 0 :(得分:2)
正如Stephen Lee Parker所说,确实可以向某个窗口发送击键。也就是说,假设您拥有浏览器窗口的句柄。
此外,您选择的浏览器应支持关闭单独选项卡的热键,但Ctrl + W大部分时间都可以使用。
使用:
using System.Runtime.InteropServices;
和
[DllImportAttribute("user32.dll", EntryPoint = "SetForegroundWindow")]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow([InAttribute()] IntPtr hWnd);
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
byte W = 0x57; //the keycode for the W key
public static void Send(byte KeyCode, bool Ctrl, bool Alt, bool Shift, bool Win)
{
byte Keycode = (byte)KeyCode;
uint KEYEVENTF_KEYUP = 2;
byte VK_CONTROL = 0x11;
byte VK_MENU = 0x12;
byte VK_LSHIFT = 0xA0;
byte VK_LWIN = 0x5B;
if (Ctrl)
keybd_event(VK_CONTROL, 0, 0, 0);
if (Alt)
keybd_event(VK_MENU, 0, 0, 0);
if (Shift)
keybd_event(VK_LSHIFT, 0, 0, 0);
if (Win)
keybd_event(VK_LWIN, 0, 0, 0);
//true keycode
keybd_event(Keycode, 0, 0, 0); //down
keybd_event(Keycode, 0, KEYEVENTF_KEYUP, 0); //up
if (Ctrl)
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
if (Alt)
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
if (Shift)
keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
if (Win)
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
}
您可以将键盘上的任何键码虚拟发送到当前活动的窗口。由于您可以使用Win32轻松设置前台窗口,因此这适用于大多数应用程序。
您还可以看到此代码首先“按下”任何选定的修改键,然后在释放所有内容之前按下给定键码的键,使其能够发送CTRL + W。
void CloseTab()
{
SetForegroundWindow(_browserWindow.Handle);
Send(W, true, false, false, false); //Ctrl+W
}
祝你好运!
(这也是我的第一个答案,所以我真的希望我能帮助你们中的一些人)
答案 1 :(得分:0)
还有其他方法可以使用dotnetopenauth。但是如果你真的想使用网络浏览器,我建议你使用.Net WebBrowser控件来处理任务,并处理Navigated事件以确定何时关闭它。
答案 2 :(得分:0)
可能要回答太久了,但今天我遇到了同样的问题,我将采用这种方式: 在新的浏览器进程中打开url。 Open a URL in a new browser process
然后在认证后或任何你想要的;例如就我而言;当用户将引脚输入我的WPF时;从twitter生成,我可以轻松关闭个别流程。 通过这种方式,您无需担心自打开新浏览器进程以来的其他选项卡。
答案 3 :(得分:0)
我通过将CTRL-W发送到浏览器窗口来完成此操作...