我正在编写一个应用程序,我需要在Windows上打开或关闭飞行模式。我看过this question,但答案只能获得状态,或者说你不能为Metro应用程序做这样的事情。我不制作一个现代/都市应用程序,所以我不需要担心应用程序沙盒。
是否有开启/关闭飞行模式的API,我应该如何使用它?
编辑:在我的用例中,我知道我可以控制它,用户可以使用。
另外,我发现this msdn question的摘录如下:
Windows 8(版本8250),我可以在Metro风格网络设置界面中打开/关闭飞行模式。
如何以编程方式执行此操作?
Microsoft定义了无线单选按钮的HID使用代码(用法:0xC6)。
问题:无线电按钮是否有一些虚拟键码?如果是这样,Application可以通过Keybd_event发送此密钥代码。
- 醇>
WLANAPI.dll导出API WlanStoreRadioStateOnEnteringAirPlaneMode,但此API没有任何文档。
问题:您能提供详细信息吗?是否用于控制飞机模式,如何调用此API?
显然(为了给出答案的总结),可以使用MobileBroadbandRadioState
枚举来检查飞行模式的状态。
HID路线可能是docs的可能性。显然,这是一个问题,是否可以将代码0xc6发送到kbd_event。
EDIT2:显然有一个名为Network Flyout
的窗口我正在考虑列举孩子找到转换,但我没有取得多大成功。我将不得不再使用Spy ++来查找。
答案 0 :(得分:1)
以下所有内容都是我通过逆向工程发现的。
Windows 内部用于获取/设置飞行模式的内部 API 使用对“RMsvc”服务(位于“RMApi.dll”中)的 COM 调用。该服务正在导出一个工厂和接口,其中包含获取/设置飞行模式的功能:
#include <Windows.h>
#include <assert.h>
#include <stdio.h>
static GUID const CLSID_RadioManagementAPI = { 0x581333f6, 0x28db, 0x41be, { 0xbc, 0x7a, 0xff, 0x20, 0x1f, 0x12, 0xf3, 0xf6 } };
static GUID const CID_IRadioManager = { 0xdb3afbfb, 0x08e6, 0x46c6, { 0xaa, 0x70, 0xbf, 0x9a, 0x34, 0xc3, 0x0a, 0xb7 } };
typedef IUnknown IUIRadioInstanceCollection; /* Didn't bother rev-engineering this one... */
typedef DWORD _RADIO_CHANGE_REASON;
typedef struct IRadioManagerVtbl IRadioManagerVtbl;
typedef struct IRadioManager {
IRadioManagerVtbl *lpVtbl;
} IRadioManager;
struct IRadioManagerVtbl {
/* IUnknown */
HRESULT (STDMETHODCALLTYPE *QueryInterface)(IRadioManager *This, GUID const *riid, LPVOID *ppvObj);
ULONG (STDMETHODCALLTYPE *AddRef)(IRadioManager *This);
ULONG (STDMETHODCALLTYPE *Release)(IRadioManager *This);
/* IRadioManager (aka. `CUIRadioManager') */
HRESULT (STDMETHODCALLTYPE *IsRMSupported)(IRadioManager *This, DWORD *pdwState);
HRESULT (STDMETHODCALLTYPE *GetUIRadioInstances)(IRadioManager *This, IUIRadioInstanceCollection **param_1);
HRESULT (STDMETHODCALLTYPE *GetSystemRadioState)(IRadioManager *This, int *pbEnabled, int *param_2, _RADIO_CHANGE_REASON *param_3);
HRESULT (STDMETHODCALLTYPE *SetSystemRadioState)(IRadioManager *This, int bEnabled);
HRESULT (STDMETHODCALLTYPE *Refresh)(IRadioManager *This);
HRESULT (STDMETHODCALLTYPE *OnHardwareSliderChange)(IRadioManager *This, int param_1, int param_2);
};
int main() {
HRESULT hr;
IRadioManager *irm;
hr = CoInitialize(NULL);
assert(!FAILED(hr));
irm = NULL;
hr = CoCreateInstance(&CLSID_RadioManagementAPI, NULL, 4,
&CID_IRadioManager, (void **)&irm);
assert(!FAILED(hr) && irm);
int bOldMode, b;
_RADIO_CHANGE_REASON c;
hr = irm->lpVtbl->GetSystemRadioState(irm, &bOldMode, &b, &c);
assert(!FAILED(hr));
printf("Old flight-mode state was: %s\n", bOldMode == 0 ? "on" : "off");
/* Set flight mode to the opposite state. */
hr = irm->lpVtbl->SetSystemRadioState(irm, bOldMode == 0 ? 1 : 0);
assert(!FAILED(hr));
irm->lpVtbl->Release(irm);
CoUninitialize();
return 0;
}