nwjs实现鼠标穿透

zsx in 代码分享 / 4 / 5388

已经把代码发布到npm上了,就这样……https://www.npmjs.com/package/nw-penetrate


首先知道,nwjs,即原node-webkit,可以通过配置package.json + CSS来实现透明背景(详见https://github.com/nwjs/nw.js/wiki/Transparency )。但是,鼠标穿透怎么解决呢?

看API,很明显这么奇葩的需求没人做……纯JavaScript肯定实现不了,就只能上API了。这样就是和平台有关了,所以做个Windows版就够了,Linux和Mac就懒得做了(哈哈哈哈哈哈哈哈哈哈哈)


OK,先用ffi库来调Win32 API。很好,直接npm installffi是不能用的,其用的req库有fs.existSync,在nwjs中被accessSync给替代。爽!

然后,试着上C++吧。Well done, nan库用不了!好吧,为了省事,就直接写Node 0.12.0的代码了。Node 0.10.0对照修改即可。

另外,似乎在nwjs下,bindings库也有相当麻烦的兼容问题。于是为了实现这个库,我不得不把那个库fork了一份然后修改……

完整代码见:https://github.com/zsxsoft/nw-penetrate


nwjs里没有提供获得自己Handle(Windows下hWnd)的API(https://github.com/nwjs/nw.js/issues/1337) ,所以我看也只能硬来。用GetWindowThreadProcessId + process.pid的话,考虑到因为可能有Developer Tool同时开启的缘故,所以还是用了FindWindow。反正标题也不太重要嘛是吧。另外因为不是MFC项目的缘故,ModifyStyleEx是不能用的,只能自己用SetWindowLong自行拼 


以下为最核心C++代码。

#include <node.h>

#include <v8.h>

#ifdef __WINDOWS_

#include <windows.h>

#endif

using namespace v8;



void penetrate(const FunctionCallbackInfo<Value>& args) {

	Isolate* isolate = Isolate::GetCurrent();

	HandleScope scope(isolate);

	v8::String::Utf8Value str(args[0]->ToString());

	char *name = *str;

	HWND h = FindWindow(NULL,(LPCSTR)name);

	if (h != NULL) {

		int extendedStyle = GetWindowLong(h, GWL_EXSTYLE);

		SetWindowLong(h, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT | WS_EX_LAYERED);

		args.GetReturnValue().Set(true);

		return;

	}

	args.GetReturnValue().Set(false);

}



void Init(Handle<Object> exports) {

	Isolate* isolate = Isolate::GetCurrent();

	exports->Set(String::NewFromUtf8(isolate, "penetrate"),

		FunctionTemplate::New(isolate, penetrate)->GetFunction());

}



NODE_MODULE(penetrate, Init)


如果本文对你有帮助,你可以用支付宝支持一下:

Alipay QrCode
嗯嗯嗯,所以,嗯。。。http://www.cnblogs.com/peterzo/p/6388428.html为什么一个可以编译,一个不可以呢?(另,对不起。。。另,就是这个网页的UI很好看啊)
zsx at 2017/2/11[回复]
谢谢,我刚刚改版的。。。windows.h里没有__WINDOWS_这个预定义常量,只有__WIN32。你可以看一下msdn:https://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx
__WINDOWS_,_WIN32到底什么意思呢???哎。。。(话说这封面好好看)
zsx at 2017/2/9[回复]
那些是代表编译环境是Windows的宏。另外你说的啥封面……